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


This regex is cutting off the last word in the string even though strlen is within acceptable range

$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,最后一个单词也会被丢弃。

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

使用substrstrrpos

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

我认为有人发布了一个链接到副本。接受的解决方案是:

/^.{1,156}'b/

现在,这将始终小于156个字符。如果第156个字符位于单词的中间,它将切掉最后一个单词。然而,做一些改变可以产生相反的效果。

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

编辑:


相反的效果(超过156个字符才能得到最后一个单词):

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

如何:

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

只处理长度超过156个字符的句子。

尝试如下:

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