2011-11-27 20 views
0

可能重复:
Extract a fixed number of chars from an array, just full words截断在PHP中的字符串不割字

我需要截断字符串的时候都超过20个字符长。字必须始终呆在一起,所以这个:

问好我的小朋友。

变成这样:

问好我的...

,而不是这样的:

问好我的利特...

我成立此功能基于非常old thread中的评论。这个正则表达式的问题是它删除了句子的最后一个单词(当有两个单词或更多)时。

function gen_string($string,$min=20) { 
    $new = preg_replace('/\s+?(\S+)?$/','',substr($string,0,$min)); 
    if(strlen($new) < strlen($string)) $new .= '&hellip;'; 
    return $new; 
} 

有人可以给我一个正则表达式的手吗?谢谢!

解决方案通过Alasdair(少数润饰)

function gen_string($string,$max=20) { 
    $tok = strtok($string,' '); 
    $sub = ''; 
    while($tok !== false && mb_strlen($sub) < $max) { 
     if(strlen($sub) + mb_strlen($tok) <= $max) { 
      $sub .= $tok.' '; 
     } else { 
      break; 
     } 
     $tok = strtok(' '); 
    } 
    $sub = trim($sub); 
    if(mb_strlen($sub) < mb_strlen($string)) $sub .= '&hellip;'; 
    return $sub; 
} 
+0

重复[#1](http://stackoverflow.com /问题/ 79960 /如何对截断-A-字符串中的PHP到所述字-最接近到一个-一定-数的-甜心)[#2](HTTP://计算器。 COM /问题/ 965235 /如何-可以-I-截断-A-字符串中的PHP)[#3](http://stackoverflow.com/questions/1270644/php-truncate-text-at-word-boundaries ),也许更多... – Peter

+1

尝试T他的链接,可以帮助你... http://stackoverflow.com/a/26098951/3944217 – edCoder

回答

1
function gen_string($string,$max=20) 
{ 
    $tok=strtok($string,' '); 
    $string=''; 
    while($tok!==false && strlen($string)<$max) 
    { 
     if (strlen($string)+strlen($tok)<=$max) 
      $string.=$tok.' '; 
     else 
      break; 
     $tok=strtok(' '); 
    } 
    return trim($string).'...'; 
} 

看到它在行动:CodePad

或者,使用特殊字符(必须安装多字节字符串函数):

function gen_string($string,$max=20) 
{ 
    $tok=strtok($string,' '); 
    $string=''; 
    while($tok!==false && mb_strlen($string)<$max) 
    { 
     if (mb_strlen($string)+mb_strlen($tok)<=$max) 
      $string.=$tok.' '; 
     else 
      break; 
     $tok=strtok(' '); 
    } 
    return trim($string).'...'; 
} 
+0

请注意,由于它在结尾添加了3个句点,如果您最多需要20个字符,您应该使用17作为第二个参数来调用它。或者你可以在函数的最后一行删除'。'..'''。 – Alasdair

+0

它应该是非常快的,它使用strtok并且一旦你完成就会中断。它也非常有记忆效率!要保存这些字节! ;) – Alasdair

+0

发现错误。当$ string中的最后一个字母位于$ max位置时,它将删除该单词。例如:gen_string('sáyhello tommy',15)返回“say hello”而不是“sáyhello tommy”...它的长度为15个字符,所以它应该返回完整的字符串。只有在使用特殊字符时才会发生。任何想法为什么发生这种情况? – andufo

2

你很可能只是用wordwrap()对于这一点,对不对?

strstr(wordwrap($string, $min), "\n", true) 

它比使用正则表达式更快,更干净。

+0

wordwrap无法与所有utf8字符(例如:中文,西班牙特殊口音)打好 – andufo

+0

如果你想要一个MB换行,看看这个:http://php.net/manual/en/function.wordwrap.php#106088 –

+0

确定固定的UTF8的事情,但我仍然得到这个错误与您的代码:警告:错误的参数计数的strstr( )---很奇怪,参数的数量是正确的。 – andufo