如何截断一个string到PHP的前20个单词?

如何截断一个string在PHP 20个单词后?

 function limit_text($text, $limit) { if (str_word_count($text, 0) > $limit) { $words = str_word_count($text, 2); $pos = array_keys($words); $text = substr($text, 0, $pos[$limit]) . '...'; } return $text; } echo limit_text('Hello here is a long sentence blah blah blah blah blah hahahaha haha haaaaaa', 5); 

输出:

 Hello here is a long ... 

将数字2更改为下面的数字19以获得前20个单词。 下面的例子演示了如何使用2来得到前3个单词:(所以把2改成19 ,它会给你前20个单词)

 function first3words($s) { return preg_replace('/((\w+\W*){2}(\w+))(.*)/', '${1}', $s); } var_dump(first3words("hello yes, world wah ha ha")); # => "hello yes, world" var_dump(first3words("hello yes,world wah ha ha")); # => "hello yes,world" var_dump(first3words("hello yes world wah ha ha")); # => "hello yes world" var_dump(first3words("hello yes world")); # => "hello yes world" var_dump(first3words("hello yes world.")); # => "hello yes world" var_dump(first3words("hello yes")); # => "hello yes" var_dump(first3words("hello")); # => "hello" var_dump(first3words("a")); # => "a" var_dump(first3words("")); # => "" 

到最近的空间

截断到目标字符的最近的前一个空格。 演示

  • $str要截断的string
  • $chars要删除的$chars数量可以被$to_space覆盖
  • $to_space boolean是否从$chars limit附近的空间截断

function

 function truncateString($str, $chars, $to_space, $replacement="...") { if($chars > strlen($str)) return $str; $str = substr($str, 0, $chars); $space_pos = strrpos($str, " "); if($to_space && $space_pos >= 0) $str = substr($str, 0, strrpos($str, " ")); return($str . $replacement); } 

样品

 <?php $str = "this is a string that is just some text for you to test with"; print(truncateString($str, 20, false) . "\n"); print(truncateString($str, 22, false) . "\n"); print(truncateString($str, 24, true) . "\n"); print(truncateString($str, 26, true, " :)") . "\n"); print(truncateString($str, 28, true, "--") . "\n"); ?> 

产量

 this is a string tha... this is a string that ... this is a string that... this is a string that is :) this is a string that is-- 

简单且完全装备的truncate()方法:

 function truncate($string, $width, $etc = ' ..') { $wrapped = explode('$trun$', wordwrap($string, $width, '$trun$', false), 2); return $wrapped[0] . (isset($wrapped[1]) ? $etc : ''); } 

使用explode() 。

来自文档的示例

 // Example 1 $pizza = "piece1 piece2 piece3 piece4 piece5 piece6"; $pieces = explode(" ", $pizza); echo $pieces[0]; // piece1 echo $pieces[1]; // piece2 

注意爆炸有一个限制function。 所以你可以做类似的事情

 $message = implode(" ", explode(" ", $long_message, 20)); 

它不是我自己的创作,它是对以前的post的修改。 学分去karim79。

 function limit_text($text, $limit) { $strings = $text; if (strlen($text) > $limit) { $words = str_word_count($text, 2); $pos = array_keys($words); if(sizeof($pos) >$limit) { $text = substr($text, 0, $pos[$limit]) . '...'; } return $text; } return $text; } 

通过< space >拆分string(到数组中),然后取该数组的前20个元素。

这对我来说很不错 :

创builddynamic网页(内容来源于数据库,内容pipe理系统或外部来源,如RSS提要)时,常见的问题是input文本可能太长,导致页面布局“中断”。

一种解决scheme是截断文本,使其适合页面。 这听起来很简单,但是由于在不恰当的地方切断了单词和句子,结果往往不如预期。

尝试正则expression式。

你需要的东西可以匹配20个字(或20个字的边界)。

所以(如果这不正确,我的正则expression式是非常糟糕的)

 /(\w+\b){20}/ 

这里是一些正则expression式的例子在PHP中 。

用三个点:

 function limitWords($text, $limit) { $word_arr = explode(" ", $text); if (count($word_arr) > $limit) { $words = implode(" ", array_slice($word_arr , 0, $limit) ) . ' ...'; return $words; } return $text; } 

像这样的东西可能会做的伎俩:

 <?php $words = implode(' ', array_slice(split($input, ' ', 21), 0, 20)); 

在循环中使用PHP tokenizer函数strtok() 。

 $token = strtok($string, " "); // we assume that words are separated by sapce or tab $i = 0; $first20Words = ''; while ($token !== false && $i < 20) { $first20Words .= $token; $token = strtok(" "); $i++; } echo $first20Words; 

基于动静能量的答案:

 function truncate_words($string,$words=20) { return preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string); } 

要么

 function truncate_words_with_ellipsis($string,$words=20,$ellipsis=' ...') { $new = preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string); if($new != $string){ return $new.$ellipsis; }else{ return $string; } } 

这是我实施的。

 function summaryMode($text, $limit, $link) { if (str_word_count($text, 0) > $limit) { $numwords = str_word_count($text, 2); $pos = array_keys($numwords); $text = substr($text, 0, $pos[$limit]).'... <a href="'.$link.'">Read More</a>'; } return $text; } 

正如你可以看到它是基于karim79的答案,所有需要改变的是if语句还需要检查字不是字符。

为了方便起见,我还添加了一个主函数的链接。 到目前为止,他的工作完美无瑕。 感谢原来的解决scheme提供商。

以下是我使用的一个:

  $truncate = function( $str, $length ) { if( strlen( $str ) > $length && false !== strpos( $str, ' ' ) ) { $str = preg_split( '/ [^ ]*$/', substr( $str, 0, $length )); return htmlspecialchars($str[0]) . '&hellip;'; } else { return htmlspecialchars($str); } }; return $truncate( $myStr, 50 ); 

另一个scheme

 $aContent = explode(' ', $cContent); $cContent = ''; $nCount = count($aContent); for($nI = 0; ($nI < 20 && $nI < $nCount); $nI++) { $cContent .= $aContent[$nI] . ' '; } trim($cContent, ' '); echo '<p>' . $cContent . '</p>'; 

这也工作我的UNICODE(UTF8)句子:

 function myUTF8truncate($string, $width){ if (mb_str_word_count($string) > $width) { $string= preg_replace('/((\w+\W*|| [\p{L}]+\W*){'.($width-1).'}(\w+))(.*)/', '${1}', $string); } return $string; } 

尝试下面的代码,

  $text = implode(' ', array_slice(explode(' ', $text), 0, 32)) echo $text; 

关于什么

 chunk_split($str,20); 

在PHP手册中input