Это регулярное выражение обрезает последнее слово в строке, даже если 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.
Примечание: я не хочу, чтобы строка заканчивалась в середине слова, но если включение слова не превышает строковое значение 156, оно должно быть включено.
4 ответа
С помощью 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;