Khi tôi sử dụng substr($string,0,100)
, nó cung cấp 100 ký tự đầu tiên. Đôi khi nó để lại từ cuối cùng không đầy đủ. Điều đó có vẻ lạ. Tôi có thể giới hạn bằng chữ chứ không phải char?Làm thế nào để nắm bắt các từ hoàn chỉnh bằng cách sử dụng substr() trong PHP, giới hạn theo từ?
Trả lời
Nếu bạn chỉ đếm các từ, kết quả phát ra có thể vẫn còn rất dài khi một từ "đơn" có thể có từ 30 ký tự trở lên. Tôi sẽ đề xuất thay vì cắt ngắn văn bản thành 100 ký tự, ngoại trừ nếu điều này khiến một từ bị cắt ngắn thì bạn cũng nên xóa phần cắt bớt của từ đó. Đây được bao phủ bởi câu hỏi có liên quan này:
How to Truncate a string in PHP to the word closest to a certain number of characters?
Sử dụng wordwrap
$your_desired_width = 100;
if (strlen($string) > $your_desired_width)
{
$string = wordwrap($string, 100);
$i = strpos($string, "\n");
if ($i) {
$string = substr($string, 0, $i);
}
}
Đây là một phiên bản sửa đổi của các câu trả lời here. nếu văn bản đầu vào có thể là rất dài, bạn có thể thêm dòng này trước khi cuộc gọi để WordWrap để tránh WordWrap phải phân tích toàn bộ văn bản:
$string = substr($string, 0, 101);
Sử dụng một biểu thức chính quy(Source)
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 100));
Tôi sẽ tránh sử dụng hàm wordwrap vì nó sẽ phân tích cú pháp toàn bộ chuỗi không cần thiết. Các biểu thức chính quy là tốt hơn của hai, IMO. – Matthew
@konforce: Tôi đồng ý giải pháp biểu thức chính quy rất đơn giản và linh hoạt nhưng một số người không cảm thấy thoải mái với các cụm từ thông dụng. Tôi đã đề xuất một phiên bản mới của giải pháp wordwrap. Bây giờ có ổn không? –
cụm từ thông dụng sẽ vô tình xóa từ cuối cùng. Tôi đã thêm mã để bao gồm một kiểm tra. Xem chỉnh sửa. –
tôi sẽ làm điều gì đó như:
<?php
function cut_text($text, $len)
{
for ($i = 0; $i < 10; ++$i)
{
$c = $text[$len + $i];
if ($c == ' ' || $c == "\t" || $c == "\r" || $c == "\n" || $c == '-')
break;
}
if ($i == 10) $i = 0;
return rtrim(substr($text, 0, $len + $i));
}
echo cut_text("Hello, World!", 3)."\n";
?>
Chỉ cần bắt đầu tại một số điểm ($ len) và chuyển tiếp một số lượng nhất định của charac ters ($ i) tìm kiếm ký tự vi phạm (ví dụ: khoảng trắng). Bạn cũng có thể nhìn ngược (- $ i) hoặc theo cả hai hướng, tùy thuộc vào những gì bạn đang tìm kiếm.
$a = explode('|', wordwrap($string, 100, '|');
print $a[0];
Điều này không thành công nếu nhân vật | vô tình xuất hiện trong chuỗi $. Sử dụng tốt hơn chr (0) hoặc một cái gì đó giống như nó sẽ không bao giờ xảy ra trong chuỗi $. – Peter
// 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]. '...';
}
Hãy thử một mã dòng đơn
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length));
Đây là một giải pháp rất giống với của Scott Evernden, mà còn hoạt động nếu nhân vật | vô tình xảy ra trong chuỗi:
$result = explode(chr(0), wordwrap($longtext, $len, chr(0)))[0];
tôi đã cố gắng đơn giản này và nó làm việc cho tôi
<?php echo substr($content, 0, strpos($content, ' ', 200)); ?>
Ông có thể giải thích chi tiết hơn những gì định nghĩa của bạn về một "chữ" là gì? Chúng ta chỉ nói những từ tiếng Anh? Từ trong bất kỳ ngôn ngữ nào? Bất kỳ chuỗi ký tự nào, cho dù đó là một từ thực hay không? Điều gì về con số? Chấm câu? Các biểu tượng khác? Là '<<<<<<<<' một từ? vv ... –
Văn bản đầu vào có chứa các ký tự dòng mới không? –
Hãy thử liên kết này, có thể giúp bạn http://stackoverflow.com/a/26098951/3944217 – edCoder