在没有剪切单词的情况下在php中截断一个字符串

时间:2011-11-27 13:59:01

标签: php regex string

  

可能重复:
  Extract a fixed number of chars from an array, just full words

我需要在长度超过20个字符时截断字符串。单词必须始终保持在一起,以便:

向我的小朋友问好。

成为这个:

向我问好...

而不是:

向我的小伙伴问好......

我根据非常old thread的评论来设置此功能。这个正则表达式的问题在于它删除了句子的最后一个单词(当有2个单词或更多单词时)。

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;
}

2 个答案:

答案 0 :(得分:5)

你可能只是使用wordwrap(),对吗?

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

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

答案 1 :(得分: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).'...';
}