Когда я использую 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)); ?>