即使strlen在可接受的范围内,这个正则表达式也会切断字符串中的最后一个单词

时间:2013-03-29 14:16:17

标签: php regex preg-replace substr

$theExcerpt = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis'

$theExcerptAppend = (strlen($theExcerpt) > 156) ? '...' : '';
$theExcerpt = preg_replace('/\s+?(\S+)?$/', '', substr($theExcerpt, 0, 156));
$theExcerpt .= $theExcerptAppend;

只要输入短语长度超过156个字符,脚本就可以正常工作。但是,当长度小于156时(如此处为154),即使包括单词在内的字符串仍然小于156,最后一个单词也会被删除。

注意:我不希望字符串在单词的中间终止,但如果单词的包含不超过156的strlen值,则应该包含它。< / p>

4 个答案:

答案 0 :(得分:5)

使用substrstrrpos

if (strlen($theExcerpt) > 156) {
    $theExceprt = substr($theExcerpt, 0, 156);
    $theExcerpt = substr($theExcerpt, 0, strrpos($theExcerpt, ' '));        
    $theExcerpt .= '...';
}

答案 1 :(得分:1)

我认为有人发布了指向重复的链接。接受的解决方案是:

/^.{1,156}\b/

现在,这总是少于156个字符。如果第156个字符位于单词的中间,它将删除最后一个单词。但是可以做出一些改变以产生相反的效果。

注意:只需使用此正则表达式将preg_match应用于您的字符串。

修改
相反的效果(超过156个字符来得到最后一个字):

/^.{1,155}(.)?(?(1).*?\b)/

答案 2 :(得分:0)

怎么样:

$theExcerpt = preg_replace('/(?=.{156})\s+?(\S+)?$/', '', substr($theExcerpt, 0, 156));

只有当句子超过156个字符时,才会处理该句子。

答案 3 :(得分:0)

尝试以下方法:

$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus egestas, lacus non dapibus placerat, justo mi adipiscing libero, id ultrices neque metus nec lorem. Quisque vitae dui facilisis ligula tristique dapibus. Ut egestas ligula in tortor facilisis pharetra id vitae eros. Donec commodo laoreet nisi porttitor tincidunt. Donec tortor enim, pharetra in accumsan sit amet, scelerisque ac massa. Morbi massa erat, mattis non faucibus a, feugiat imperdiet lectus. Praesent tincidunt libero id enim cursus non sagittis nisl accumsan. Maecenas massa lorem, consectetur ut rhoncus ac, ullamcorper a tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sit amet eros.';

$limit = 156;
$output = preg_replace('/^(.{'.$limit.'})(\S|\s|\w+)(.*)/', '$1$2 ...', $string);

echo $output;