Как фиксировать полные слова, используя substr () в PHP, ограничиваясь словом?

Когда я использую substr($string,0,100) , он дает первые 100 символов. Иногда он оставил последнее слово незавершенным. Это странно. Могу ли я ограничивать слово, а не символ?

Если вы просто посчитаете слова, то получившееся сообщение может быть очень длинным, поскольку одно «слово» может содержать 30 или более символов. Я бы предложил вместо этого обрезать текст до 100 символов, кроме случаев, когда это приводит к усечению слова, тогда вы также должны удалить усеченную часть слова. Это связано с этим связанным вопросом:

Как усечь строку в PHP до слова, ближайшего к определенному числу символов?

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

 $your_desired_width = 100; if (strlen($string) > $your_desired_width) { $string = wordwrap($string, 100); $i = strpos($string, "\n"); if ($i) { $string = substr($string, 0, $i); } } 

Это измененные варианты ответа здесь . если входной текст может быть очень длинным, вы можете добавить эту строку перед вызовом wordwrap, чтобы избежать словесного анализа, чтобы проанализировать весь текст:

 $string = substr($string, 0, 101); 

Используя регулярное выражение (Источник)

 $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 100)); 
 $a = explode('|', wordwrap($string, 100, '|'); print $a[0]; 

Попробуйте использовать один код строки

 $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length)); 

Я бы сделал что-то вроде:

 <?php function cut_text($text, $len) { for ($i = 0; $i < 10; ++$i) { $c = $text[$len + $i]; if ($c == ' ' || $c == "\t" || $c == "\r" || $c == "\n" || $c == '-') break; } if ($i == 10) $i = 0; return rtrim(substr($text, 0, $len + $i)); } echo cut_text("Hello, World!", 3)."\n"; ?> 

Просто начните в какой-то момент ($ len) и переместите определенное количество символов ($ i), чтобы найти нарушающий символ (например, пробел). Вы также можете посмотреть назад (- $ i) или в обоих направлениях, в зависимости от того, что вы ищете.

 // Trim very long text to 120 characters. Add an ellipsis if the text is trimmed. if(strlen($very_long_text) > 120) { $matches = array(); preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches); $trimmed_text = $matches[0]. '...'; } 

Это решение очень похоже на решение Скотта Эверндена, но также работает, если персонаж | случайно происходит в строке:

 $result = explode(chr(0), wordwrap($longtext, $len, chr(0)))[0]; 

я попробовал этот простой, и это сработало для меня

 <?php echo substr($content, 0, strpos($content, ' ', 200)); ?>