Làm thế nào để cắt một chuỗi trong PHP thành từ gần nhất với một số ký tự nhất định?


183

Tôi có một đoạn mã được viết bằng PHP, kéo một khối văn bản từ cơ sở dữ liệu và gửi nó ra một widget trên trang web. Khối văn bản gốc có thể là một bài viết dài hoặc một hoặc hai câu ngắn; nhưng đối với tiện ích này, tôi không thể hiển thị nhiều hơn 200 ký tự. Tôi có thể sử dụng chất nền () để cắt văn bản ở 200 ký tự, nhưng kết quả sẽ bị cắt ở giữa các từ-- điều tôi thực sự muốn là cắt văn bản ở cuối từ cuối cùng trước 200 ký tự.


2
Câu hỏi dự định nói rằng văn bản rút gọn sẽ phù hợp với một số pixel cố định trên một trang web. Trong trường hợp này, tùy thuộc vào phông chữ được chọn, không gian cần thiết cho mỗi char không phải là hằng số. Và do đó, chúng ta không thể cho rằng 200 ký tự sẽ phù hợp nhất với các pixel có sẵn. Cho đến nay (cho đến ngày 02 tháng 3 năm 2011), tất cả các câu trả lời dưới đây đều thiếu điểm này và do đó không ai trong số họ cung cấp một giải pháp đáng tin cậy. - :(
LionHeart

1
Không, không thực sự. Bạn có thể đặt phông chữ theo một cách đáng tin cậy và sau đó đo lường trường hợp xấu nhất là có bao nhiêu ký tự rộng nhất sẽ phù hợp. Và nếu bạn cần chắc chắn 100% về cách trình duyệt hiển thị nó, thì dù sao đó cũng không phải là vấn đề của PHP.
Mołot

Hãy thử liên kết này, có thể giúp bạn stackoverflow.com/a/26098951/3944217
edCoder

Bạn có thể thấy s($str)->truncateSafely(200)hữu ích, như được tìm thấy trong thư viện độc lập này .
caw

Câu trả lời:


221

Bằng cách sử dụng chức năng wordwrap . Nó phân chia các văn bản thành nhiều dòng sao cho chiều rộng tối đa là chiều rộng bạn đã chỉ định, phá vỡ các ranh giới từ. Sau khi chia tách, bạn chỉ cần lấy dòng đầu tiên:

substr($string, 0, strpos(wordwrap($string, $your_desired_width), "\n"));

Một điều mà oneliner này không xử lý là trường hợp khi bản thân văn bản ngắn hơn chiều rộng mong muốn. Để xử lý trường hợp cạnh này, người ta nên làm một cái gì đó như:

if (strlen($string) > $your_desired_width) 
{
    $string = wordwrap($string, $your_desired_width);
    $string = substr($string, 0, strpos($string, "\n"));
}

Giải pháp trên có vấn đề cắt văn bản sớm nếu nó chứa một dòng mới trước điểm cắt thực tế. Đây là một phiên bản giải quyết vấn đề này:

function tokenTruncate($string, $your_desired_width) {
  $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
  $parts_count = count($parts);

  $length = 0;
  $last_part = 0;
  for (; $last_part < $parts_count; ++$last_part) {
    $length += strlen($parts[$last_part]);
    if ($length > $your_desired_width) { break; }
  }

  return implode(array_slice($parts, 0, $last_part));
}

Ngoài ra, đây là lớp kiểm tra PHPUnit được sử dụng để kiểm tra việc thực hiện:

class TokenTruncateTest extends PHPUnit_Framework_TestCase {
  public function testBasic() {
    $this->assertEquals("1 3 5 7 9 ",
      tokenTruncate("1 3 5 7 9 11 14", 10));
  }

  public function testEmptyString() {
    $this->assertEquals("",
      tokenTruncate("", 10));
  }

  public function testShortString() {
    $this->assertEquals("1 3",
      tokenTruncate("1 3", 10));
  }

  public function testStringTooLong() {
    $this->assertEquals("",
      tokenTruncate("toooooooooooolooooong", 10));
  }

  public function testContainingNewline() {
    $this->assertEquals("1 3\n5 7 9 ",
      tokenTruncate("1 3\n5 7 9 11 14", 10));
  }
}

BIÊN TẬP :

Các ký tự UTF8 đặc biệt như 'à' không được xử lý. Thêm 'u' vào cuối REGEX để xử lý nó:

$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);


1
Điều này có vẻ như nó sẽ cắt sớm văn bản nếu có \ntrước chiều rộng mong muốn.
Kendall Hopkins

@KendallHopkins: đúng, thực sự có vấn đề. Tôi đã cập nhật câu trả lời với một triển khai thay thế để giải quyết vấn đề đã cho.
Grey Panther

Ví dụ này có hoạt động với một chuỗi chứa các thẻ html như thẻ đoạn không?
Unlimitedlessloop

Nó thực sự hữu ích với tôi, cơn đau đầu của tôi là những Arabicchữ cái dài và giờ đã giảm thành từ đúng với sự trợ giúp của tokenTruncatechức năng .. tnx a triệu :)
Aditya P Bhatt

1
Tại sao không thêm: if (strlen ($ string) <= $ your_desired_ thong) trả về $ chuỗi; như tuyên bố đầu tiên?
Darko Romanov

139

Điều này sẽ trả về 200 ký tự đầu tiên của từ:

preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 201));

7
Hầu hết. Có vẻ như nó loại bỏ từ cuối cùng của câu cho tôi không có vấn đề gì.
ReX357

hoạt động tuyệt vời nhưng tôi tìm thấy lỗi tương tự như ReX357. Khi có nhiều hơn 1 từ, nó sẽ xóa từ cuối cùng.
Andres SK

25
Chỉ cần bọc nó trong một kiểm tra để đảm bảo chuỗi dài hơn so với những gì bạn đang kiểm tra (giống như câu trả lời được chấp nhận)if (strlen($string) > $your_desired_width) { preg_replace(...); }
Blair McMillan

Tôi đã chỉnh sửa câu trả lời để bao gồm lời khuyên @BlairMcMillan
Kim Stacks

2
Cải tiến nhỏ cho regex: dấu ngoặc đơn làm cho \ S + cuối cùng tùy chọn cho trận đấu, nhưng họ cũng bắt được các ký tự đó. Vì chúng ta không cần phải bắt những ký tự đó, làm cho dấu ngoặc đơn không bị bắt như vậy:/\s+?(?:\S+)?$/
pcronin

45
$WidgetText = substr($string, 0, strrpos(substr($string, 0, 200), ' '));

Và ở đó bạn có nó - một phương pháp đáng tin cậy để cắt bất kỳ chuỗi nào thành toàn bộ từ gần nhất, trong khi vẫn ở dưới độ dài chuỗi tối đa.

Tôi đã thử các ví dụ khác ở trên và chúng không mang lại kết quả mong muốn.


11
Nếu độ dài của chuỗi đã cho nhỏ hơn độ dài tối đa, điều này sẽ cắt mọi thứ cho đến khoảng trống cuối cùng. Để tránh điều này, hãy bọc nó trong một iftuyên bố:if (strlen($str) > 200) { ... }
Amal Murali

Đơn giản và có lẽ nhanh hơn nhiều so với các giải pháp khác.
Vladan

1
Một vấn đề với điều này là nó trả về một chuỗi rỗng nếu chuỗi không chứa khoảng trắng.
orrd

Có thể được đơn giản hóa thành:$WidgetText = substr($string, 0, strpos($string, ' ', 200));
wranvaud

36

Giải pháp sau đây được sinh ra khi tôi nhận thấy tham số $ break của hàm wordwrap :

chuỗi wordwrap (chuỗi $ str [, int $ width = 75 [, chuỗi $ break = "\ n" [, bool $ cut = false]]])

Đây là giải pháp :

/**
 * Truncates the given string at the specified length.
 *
 * @param string $str The input string.
 * @param int $width The number of chars at which the string will be truncated.
 * @return string
 */
function truncate($str, $width) {
    return strtok(wordwrap($str, $width, "...\n"), "\n");
}

Ví dụ 1.

print truncate("This is very long string with many chars.", 25);

Ví dụ trên sẽ xuất ra:

This is very long string...

Ví dụ # 2.

print truncate("This is short string.", 25);

Ví dụ trên sẽ xuất ra:

This is short string.

2
điều này không hoạt động nếu chuỗi đã có một ký tự dòng mới (ví dụ: nếu bạn đang cố trích xuất một descriptionbài đăng trên blog)
supersan

1
@supersan Luôn có thể xử lý trước preg_replace('/\s+/', ' ', $description)để thay thế tất cả các ký tự khoảng trắng bằng một khoảng trắng;)
Mavelo

9

Hãy ghi nhớ bất cứ khi nào bạn chia tách bằng "từ" bất cứ nơi nào mà một số ngôn ngữ như tiếng Trung và tiếng Nhật không sử dụng ký tự khoảng trắng để phân chia các từ. Ngoài ra, người dùng độc hại có thể chỉ cần nhập văn bản mà không có bất kỳ khoảng trắng nào hoặc sử dụng một số Unicode giống với ký tự không gian tiêu chuẩn, trong trường hợp đó, bất kỳ giải pháp nào bạn sử dụng đều có thể hiển thị toàn bộ văn bản. Một cách để giải quyết vấn đề này có thể là kiểm tra độ dài chuỗi sau khi tách nó trên các khoảng trắng như bình thường, sau đó, nếu chuỗi vẫn vượt quá giới hạn bất thường - có thể là 225 ký tự trong trường hợp này - đi trước và chia nhỏ nó ở giới hạn đó.

Thêm một lời cảnh báo với những thứ như thế này khi nói đến các ký tự không phải ASCII; các chuỗi chứa chúng có thể được hiểu bởi strlen () tiêu chuẩn của PHP là dài hơn thực tế, bởi vì một ký tự có thể mất hai hoặc nhiều byte thay vì chỉ một. Nếu bạn chỉ sử dụng các hàm strlen () / struct () để phân tách các chuỗi, bạn có thể tách một chuỗi ở giữa một ký tự! Khi nghi ngờ, mb_strlen () / mb_substr () dễ đánh lừa hơn một chút.


8

Sử dụng strpose và chất nền:

<?php

$longString = "I have a code snippet written in PHP that pulls a block of text.";
$truncated = substr($longString,0,strpos($longString,' ',30));

echo $truncated;

Điều này sẽ cung cấp cho bạn một chuỗi cắt ngắn ở khoảng trống đầu tiên sau 30 ký tự.


1
Xin chào, nếu độ dài chuỗi không có khoảng trống sẽ nhỏ hơn 30 thì đó sẽ là lỗi trả về. và Kết quả ở đây sẽ là 31 ký tự đầu tiên chứ không phải 30 ..
Er. Anurag Jain

5

Ở đây bạn đi:

function neat_trim($str, $n, $delim='…') {
   $len = strlen($str);
   if ($len > $n) {
       preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches);
       return rtrim($matches[1]) . $delim;
   }
   else {
       return $str;
   }
}

Cảm ơn bạn, tôi tìm thấy chức năng hữu ích và đáng tin cậy nhất của bạn cho tất cả những câu trả lời này cho nhu cầu của tôi. Tuy nhiên, làm thế nào tôi có thể làm cho nó hỗ trợ các chuỗi nhiều byte?
ctrlbrk

5

Đây là chức năng của tôi dựa trên phương pháp của @ Cd-MaN.

function shorten($string, $width) {
  if(strlen($string) > $width) {
    $string = wordwrap($string, $width);
    $string = substr($string, 0, strpos($string, "\n"));
  }

  return $string;
}

4
$shorttext = preg_replace('/^([\s\S]{1,200})[\s]+?[\s\S]+/', '$1', $fulltext);

Sự miêu tả:

  • ^ - bắt đầu từ đầu chuỗi
  • ([\s\S]{1,200}) - nhận từ 1 đến 200 của bất kỳ nhân vật nào
  • [\s]+?- không bao gồm khoảng trắng ở cuối văn bản ngắn để chúng tôi có thể tránh word ...thay vìword...
  • [\s\S]+ - phù hợp với tất cả các nội dung khác

Các xét nghiệm:

  1. regex101.comhãy thêm vào orvài cái khácr
  2. regex101.com orrrr chính xác 200 ký tự.
  3. regex101.comsau khi r orrrrrloại trừ thứ năm .

Thưởng thức.


tôi không hiểu tài liệu PHP. tôi biết rằng đó $1là một "sự thay thế", nhưng trong bối cảnh cụ thể này, nó đề cập đến cái gì ?? một biến rỗng?
oldboy

1
@Anthony $1tham chiếu để khớp trong ngoặc ([\s\S]{1,200}). $2sẽ tham chiếu hai cặp dấu ngoặc thứ hai nếu có bất kỳ mẫu nào.
hlcs

3

Thật đáng ngạc nhiên khi thật khó để tìm ra giải pháp hoàn hảo cho vấn đề này. Tôi chưa tìm thấy câu trả lời trên trang này mà không thất bại trong một số trường hợp (đặc biệt là nếu chuỗi chứa dòng mới hoặc tab hoặc nếu ngắt từ là bất cứ thứ gì ngoài khoảng trắng hoặc nếu chuỗi có UTF- 8 ký tự đa nhân).

Đây là một giải pháp đơn giản mà hoạt động trong mọi trường hợp. Có những câu trả lời tương tự ở đây, nhưng công cụ sửa đổi "s" rất quan trọng nếu bạn muốn nó hoạt động với đầu vào đa dòng và công cụ sửa đổi "u" làm cho nó đánh giá chính xác các ký tự đa dòng UTF-8.

function wholeWordTruncate($s, $characterCount) 
{
    if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
    return $s;
}

Một trường hợp cạnh có thể xảy ra với điều này ... nếu chuỗi không có bất kỳ khoảng trắng nào trong các ký tự $ characterCount đầu tiên, nó sẽ trả về toàn bộ chuỗi. Nếu bạn thích nó buộc phải nghỉ ở $ characterCount ngay cả khi đó không phải là ranh giới từ, bạn có thể sử dụng điều này:

function wholeWordTruncate($s, $characterCount) 
{
    if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
    return mb_substr($return, 0, $characterCount);
}

Một tùy chọn cuối cùng, nếu bạn muốn có nó thêm dấu chấm lửng nếu nó cắt ngắn chuỗi ...

function wholeWordTruncate($s, $characterCount, $addEllipsis = ' …') 
{
    $return = $s;
    if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) 
        $return = $match[0];
    else
        $return = mb_substr($return, 0, $characterCount);
    if (strlen($s) > strlen($return)) $return .= $addEllipsis;
    return $return;
}

2

Tôi sẽ sử dụng hàm preg_match để làm điều này, vì những gì bạn muốn là một biểu thức khá đơn giản.

$matches = array();
$result = preg_match("/^(.{1,199})[\s]/i", $text, $matches);

Biểu thức có nghĩa là "khớp với bất kỳ chuỗi con nào bắt đầu từ đầu độ dài 1-200 kết thúc bằng dấu cách." Kết quả là kết quả $ và trận đấu là trong trận đấu $. Điều đó quan tâm đến câu hỏi ban đầu của bạn, đặc biệt kết thúc trên bất kỳ không gian nào. Nếu bạn muốn làm cho nó kết thúc trên dòng mới, hãy thay đổi biểu thức thông thường thành:

$result = preg_match("/^(.{1,199})[\n]/i", $text, $matches);

2

Ok vì vậy tôi đã nhận được một phiên bản khác dựa trên các câu trả lời ở trên nhưng lấy thêm nhiều thứ trong tài khoản (utf-8, \ n và & nbsp;), cũng là một dòng tước mã ngắn wordpress được nhận xét nếu được sử dụng với wp.

function neatest_trim($content, $chars) 
  if (strlen($content) > $chars) 
  {
    $content = str_replace('&nbsp;', ' ', $content);
    $content = str_replace("\n", '', $content);
    // use with wordpress    
    //$content = strip_tags(strip_shortcodes(trim($content)));
    $content = strip_tags(trim($content));
    $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, 0, $chars));

    $content = trim($content) . '...';
    return $content;
  }

2

Đây là một sửa chữa nhỏ cho câu trả lời của mattmac:

preg_replace('/\s+?(\S+)?$/', '', substr($string . ' ', 0, 201));

Sự khác biệt duy nhất là thêm một khoảng trắng ở cuối chuỗi $. Điều này đảm bảo từ cuối cùng không bị cắt theo nhận xét của ReX357.

Tôi không có đủ điểm rep để thêm nhận xét này.


2
/*
Cut the string without breaking any words, UTF-8 aware 
* param string $str The text string to split
* param integer $start The start position, defaults to 0
* param integer $words The number of words to extract, defaults to 15
*/
function wordCutString($str, $start = 0, $words = 15 ) {
    $arr = preg_split("/[\s]+/",  $str, $words+1);
    $arr = array_slice($arr, $start, $words);
    return join(' ', $arr);
}

Sử dụng:

$input = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';
echo wordCutString($input, 0, 10); 

Điều này sẽ xuất ra 10 từ đầu tiên.

Các preg_split chức năng được sử dụng để tách một chuỗi thành chuỗi con. Các ranh giới dọc theo chuỗi sẽ được phân tách, được chỉ định bằng cách sử dụng mẫu biểu thức chính quy.

preg_split Hàm có 4 tham số, nhưng chỉ có 3 tham số đầu tiên có liên quan đến chúng tôi ngay bây giờ.

Tham số đầu tiên - Mẫu Tham số đầu tiên là mẫu biểu thức chính quy theo đó chuỗi được chia. Trong trường hợp của chúng tôi, chúng tôi muốn chia chuỗi qua ranh giới từ. Vì vậy, chúng tôi sử dụng một lớp nhân vật được xác định trước\s phù hợp với các ký tự khoảng trắng như khoảng trắng, tab, trả về vận chuyển và nguồn cấp dữ liệu.

Tham số thứ hai - Chuỗi đầu vào Tham số thứ hai là chuỗi văn bản dài mà chúng tôi muốn tách.

Tham số thứ ba - Giới hạn Tham số thứ ba chỉ định số lượng các chuỗi con sẽ được trả về. Nếu bạn đặt giới hạn thành n, preg_split sẽ trả về một mảng gồm n phần tử. Các n-1yếu tố đầu tiên sẽ chứa các chuỗi con. Phần (n th)tử cuối cùng sẽ chứa phần còn lại của chuỗi.


1

Dựa trên regex của @Justin Poliey:

// Trim very long text to 120 characters. Add an ellipsis if the text is trimmed.
if(strlen($very_long_text) > 120) {
  $matches = array();
  preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches);
  $trimmed_text = $matches[0]. '...';
}

1

Tôi có một chức năng thực hiện gần như những gì bạn muốn, nếu bạn thực hiện một vài chỉnh sửa, nó sẽ phù hợp chính xác:

<?php
function stripByWords($string,$length,$delimiter = '<br>') {
    $words_array = explode(" ",$string);
    $strlen = 0;
    $return = '';
    foreach($words_array as $word) {
        $strlen += mb_strlen($word,'utf8');
        $return .= $word." ";
        if($strlen >= $length) {
            $strlen = 0;
            $return .= $delimiter;
        }
    }
    return $return;
}
?>

1

Đây là cách tôi đã làm nó:

$string = "I appreciate your service & idea to provide the branded toys at a fair rent price. This is really a wonderful to watch the kid not just playing with variety of toys but learning faster compare to the other kids who are not using the BooksandBeyond service. We wish you all the best";

print_r(substr($string, 0, strpos(wordwrap($string, 250), "\n")));

0

Tôi biết điều này đã cũ, nhưng ...

function _truncate($str, $limit) {
    if(strlen($str) < $limit)
        return $str;
    $uid = uniqid();
    return array_shift(explode($uid, wordwrap($str, $limit, $uid)));
}

0

Tôi tạo một hàm tương tự như lớp nền và sử dụng ý tưởng của @Dave.

function substr_full_word($str, $start, $end){
    $pos_ini = ($start == 0) ? $start : stripos(substr($str, $start, $end), ' ') + $start;
    if(strlen($str) > $end){ $pos_end = strrpos(substr($str, 0, ($end + 1)), ' '); } // IF STRING SIZE IS LESSER THAN END
    if(empty($pos_end)){ $pos_end = $end; } // FALLBACK
    return substr($str, $pos_ini, $pos_end);
}

Ps.: Việc cắt chiều dài đầy đủ có thể nhỏ hơn chất nền.


0

Đã thêm các câu lệnh IF / ELSEIF vào mã từ DaveAmalMurali để xử lý các chuỗi không có khoảng trắng

if ((strpos($string, ' ') !== false) && (strlen($string) > 200)) { 
    $WidgetText = substr($string, 0, strrpos(substr($string, 0, 200), ' ')); 
} 
elseif (strlen($string) > 200) {
    $WidgetText = substr($string, 0, 200);
}

0

Tôi tìm thấy công việc này:

hàm rút gọn_ chuỗi_to_whole_word ($ chuỗi, $ max_length, $ buffer) {

if (strlen($string)>$max_length) {
    $string_cropped=substr($string,0,$max_length-$buffer);
    $last_space=strrpos($string_cropped, " ");
    if ($last_space>0) {
        $string_cropped=substr($string_cropped,0,$last_space);
    }
    $abbreviated_string=$string_cropped."&nbsp;...";
}
else {
    $abbreviated_string=$string;
}

return $abbreviated_string;

}

Bộ đệm cho phép bạn điều chỉnh độ dài của chuỗi trả về.


0

Dùng cái này:

đoạn mã sau sẽ xóa ','. Nếu bạn có bất kỳ ký tự hoặc chuỗi con nào, bạn có thể sử dụng ký tự đó thay vì ','

substr($string, 0, strrpos(substr($string, 0, $comparingLength), ','))

// nếu bạn có một tài khoản chuỗi khác cho

substr($string, 0, strrpos(substr($string, 0, $comparingLength-strlen($currentString)), ','))

0

Mặc dù đây là một câu hỏi khá cũ, tôi nghĩ rằng tôi sẽ cung cấp một giải pháp thay thế, vì nó không được đề cập và hợp lệ cho PHP 4.3+.

Bạn có thể sử dụng sprintfhọ các hàm để cắt bớt văn bản, bằng cách sử dụng công cụ %.ℕssửa đổi chính xác.

Một khoảng thời gian .theo sau bởi một số nguyên có nghĩa là người phụ thuộc vào chỉ định:

  • Đối với các chỉ định e, E, f và F: đây là số chữ số sẽ được in sau dấu thập phân (theo mặc định, đây là 6).
  • Đối với các chỉ định g và G: đây là số chữ số có nghĩa tối đa được in.
  • Đối với specifier: nó hoạt động như một điểm cắt, đặt giới hạn ký tự tối đa cho chuỗi

Cắt ngắn đơn giản https://3v4l.org/QJDJU

$string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var_dump(sprintf('%.10s', $string));

Kết quả

string(10) "0123456789"

Cắt ngắn mở rộng https://3v4l.org/FCD21

Vì các sprintfchức năng tương tự substrvà sẽ cắt một phần từ. Cách tiếp cận dưới đây sẽ đảm bảo các từ không bị cắt bằng cách sử dụngstrpos(wordwrap(..., '[break]'), '[break]') với một dấu phân cách đặc biệt. Điều này cho phép chúng tôi truy xuất vị trí và đảm bảo chúng tôi không khớp với các cấu trúc câu tiêu chuẩn.

Trả lại một chuỗi mà không cắt một phần từ và không vượt quá độ rộng đã chỉ định, trong khi vẫn duy trì ngắt dòng nếu muốn.

function truncate($string, $width, $on = '[break]') {
    if (strlen($string) > $width && false !== ($p = strpos(wordwrap($string, $width, $on), $on))) {
        $string = sprintf('%.'. $p . 's', $string);
    }
    return $string;
}
var_dump(truncate('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 20));

var_dump(truncate("Lorem Ipsum is simply dummy text of the printing and typesetting industry.", 20));

var_dump(truncate("Lorem Ipsum\nis simply dummy text of the printing and typesetting industry.", 20));

Kết quả

/* 
string(36) "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  
string(14) "Lorem Ipsum is" 
string(14) "Lorem Ipsum
is" 
*/

Kết quả sử dụng wordwrap($string, $width)hoặcstrtok(wordwrap($string, $width), "\n")

/*
string(14) "Lorem Ipsum is"
string(11) "Lorem Ipsum"
*/

-1

Tôi đã sử dụng điều này trước đây

<?php
    $your_desired_width = 200;
    $string = $var->content;
    if (strlen($string) > $your_desired_width) {
        $string = wordwrap($string, $your_desired_width);
        $string = substr($string, 0, strpos($string, "\n")) . " More...";
    }
    echo $string;
?>

-1

Ở đây bạn có thể thử điều này

substr( $str, 0, strpos($str, ' ', 200) ); 

Giải pháp đó đã được đề cập trong các câu trả lời khác. Vấn đề với nó là thất bại nếu chuỗi có độ dài nhỏ hơn 200 ký tự hoặc nếu nó không chứa bất kỳ khoảng trắng nào. Nó cũng không giới hạn chuỗi ở 200 ký tự, thay vào đó, nó phá vỡ chuỗi ở khoảng trống sau 200 ký tự, thường không phải là điều bạn muốn.
orrd

-1

Tôi tin rằng đây là cách dễ nhất để làm điều đó:

$lines = explode('♦♣♠',wordwrap($string, $length, '♦♣♠'));
$newstring = $lines[0] . ' &bull; &bull; &bull;';

Tôi đang sử dụng các ký tự đặc biệt để phân chia văn bản và cắt nó.


-2

Có thể điều này sẽ giúp ai đó:

<?php

    $string = "Your line of text";
    $spl = preg_match("/([, \.\d\-''\"\"_()]*\w+[, \.\d\-''\"\"_()]*){50}/", $string, $matches);
    if (isset($matches[0])) {
        $matches[0] .= "...";
        echo "<br />" . $matches[0];
    } else {
        echo "<br />" . $string;
    }

?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.