Это регулярное выражение отключает последнее слово в строке, хотя strlen находится в допустимом диапазоне

$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, оно должно быть включено.

Использование substr и strrpos

 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;