У меня есть фрагмент кода, написанный на PHP, который извлекает блок текста из базы данных и отправляет его виджету на веб-странице. Оригинальный блок текста может быть длинной статьей или коротким предложением или двумя; но для этого виджета я не могу отобразить больше, скажем, 200 символов. Я мог бы использовать substr (), чтобы отрубить текст на 200 символов, но в результате слова были бы обрезаны в середине слова - что мне действительно нужно, так это нарезать текст в конце последнего слова до 200 символов.
183
s($str)->truncateSafely(200)
полезным, как найти в этой автономной библиотеке .Ответы:
Используя функцию переноса слов . Он разбивает текст на несколько строк так, чтобы максимальная ширина была той, которую вы указали, ломаясь за границы слов. После разделения вы просто берете первую строку:
Одна вещь, которую этот oneliner не обрабатывает, - это случай, когда сам текст короче желаемой ширины. Чтобы обработать этот крайний случай, нужно сделать что-то вроде:
Приведенное выше решение имеет проблему преждевременной обрезки текста, если он содержит новую строку перед фактической точкой обрезки. Вот версия, которая решает эту проблему:
Кроме того, вот тестовый класс PHPUnit, используемый для тестирования реализации:
РЕДАКТИРОВАТЬ :
Специальные символы UTF8, такие как «а», не обрабатываются. Добавьте 'u' в конце REGEX, чтобы обработать это:
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
источник
\n
до желаемой ширины.Arabic
букв, и теперь она сводится к правильным словам с помощьюtokenTruncate
функции .. tnx миллион :)Это вернет первые 200 символов слов:
источник
if (strlen($string) > $your_desired_width) { preg_replace(...); }
/\s+?(?:\S+)?$/
И вот он у вас есть - надежный метод обрезания любой строки до ближайшего целого слова, оставаясь при максимальной длине строки.
Я пробовал другие примеры выше, и они не дали желаемых результатов.
источник
if
утверждения:if (strlen($str) > 200) { ... }
$WidgetText = substr($string, 0, strpos($string, ' ', 200));
Следующее решение появилось, когда я заметил параметр $ break функции wordwrap :
Вот решение :
Пример № 1.
Приведенный выше пример выведет:
Пример № 2.
Приведенный выше пример выведет:
источник
description
из блога)preg_replace('/\s+/', ' ', $description)
чтобы заменить все пробельные символы одним пробелом;)Помните, что когда вы разбиваете слово «слово» в любом месте, некоторые языки, такие как китайский и японский, не используют пробел для разделения слов. Кроме того, злонамеренный пользователь может просто ввести текст без пробелов или использовать некоторый аналог Unicode со стандартным пробелом, и в этом случае любое используемое вами решение может в конечном итоге отобразить весь текст в любом случае. Обходным путем может быть проверка длины строки после разбиения ее на обычные пробелы, а затем, если строка все еще превышает ненормальный предел - в данном случае, возможно, 225 символов, - продолжая и тупо разделяя ее на этом пределе.
Еще одна оговорка с такими вещами, когда речь идет о не-ASCII символах; Строки, содержащие их, могут быть интерпретированы стандартным PHP strlen () как более длинные, чем они есть на самом деле, потому что один символ может занимать два или более байтов вместо одного. Если вы просто используете функции strlen () / substr () для разделения строк, вы можете разделить строку в середине символа! В случае сомнений mb_strlen () / mb_substr () немного более надежны.
источник
Используйте strpos и substr:
Это даст вам обрезанную строку в первом пробеле после 30 символов.
источник
Ну вот:
источник
Вот моя функция, основанная на подходе @ Cd-MaN.
источник
Описание:
^
- начать с начала строки([\s\S]{1,200})
- получить от 1 до 200 любого персонажа[\s]+?
- не включать пробелы в конце короткого текста, чтобы мы могли избежатьword ...
вместоword...
[\s\S]+
- сопоставить весь другой контенттесты:
regex101.com
давайте добавим кor
нескольким другимr
regex101.com
orrrr
ровно 200 символов.regex101.com
после пятогоr
orrrrr
исключен.Наслаждаться.
источник
$1
это «замена», но в этом конкретном контексте, что это означает ?? пустая переменная?$1
ссылки на совпадения в квадратных скобках([\s\S]{1,200})
.$2
будет ссылаться на две вторые пары скобок, если они есть в шаблоне.Удивительно, как сложно найти идеальное решение этой проблемы. Я еще не нашел ответ на этой странице, который не дает сбой, по крайней мере, в некоторых ситуациях (особенно, если строка содержит символы новой строки или табуляции, или если разрыв слова - это что-то отличное от пробела, или если строка имеет UTF- 8 многобайтовых символов).
Вот простое решение, которое работает во всех случаях. Здесь были похожие ответы, но модификатор «s» важен, если вы хотите, чтобы он работал с многострочным вводом, а модификатор «u» позволяет правильно оценивать многобайтовые символы UTF-8.
Один возможный крайний случай с этим ... если строка не имеет никаких пробелов в первых символах $ characterCount, она вернет всю строку. Если вы предпочитаете, чтобы он вызывал разрыв в $ characterCount, даже если это не граница слова, вы можете использовать это:
Последний вариант, если вы хотите добавить многоточие, если оно обрезает строку ...
источник
Я бы использовал для этого функцию preg_match, поскольку вы хотите получить довольно простое выражение.
Выражение означает «сопоставить любую подстроку, начиная с начала длины 1-200, которая заканчивается пробелом». Результат в $ результате, а совпадение в $ совпадений. Это заботится о вашем первоначальном вопросе, который конкретно заканчивается в любом месте. Если вы хотите, чтобы это заканчивалось на новых строках, измените регулярное выражение на:
источник
Итак, я получил другую версию этого, основанную на ответах выше, но принимая во внимание больше вещей (utf-8, \ n и & nbsp;), а также строку, зачеркивающую шорткоды wordpress, закомментированные, если используется с wp.
источник
Это небольшое исправление для ответа Mattmac:
Единственное отличие заключается в добавлении пробела в конце строки $. Это гарантирует, что последнее слово не обрезается в соответствии с комментарием ReX357.
У меня недостаточно очков репутации, чтобы добавить это как комментарий.
источник
Использование:
Это выведет первые 10 слов.
preg_split
Функция используется для разбиения строки на подстроки. Границы, вдоль которых должна разбиваться строка, задаются с помощью шаблона регулярных выражений.preg_split
Функция принимает 4 параметра, но только первые 3 относятся к нам прямо сейчас.Первый параметр - шаблон Первый параметр - это шаблон регулярных выражений, по которому нужно разбить строку. В нашем случае мы хотим разбить строку по границам слова. Поэтому мы используем предопределенный класс символов
\s
который соответствует символам пробела, таким как пробел, табуляция, возврат каретки и перевод строки.Второй параметр - строка ввода Вторым параметром является длинная текстовая строка, которую мы хотим разделить.
Третий параметр - лимит Третий параметр указывает количество подстрок, которые должны быть возвращены. Если вы установите ограничение на
n
, preg_split вернет массив из n элементов. Первыеn-1
элементы будут содержать подстроки. Последний(n th)
элемент будет содержать остальную часть строки.источник
Основано на регулярном выражении @Justin Poliey:
источник
У меня есть функция, которая делает почти то, что вы хотите, если вы сделаете несколько правок, она точно подойдет:
источник
Вот как я это сделал:
источник
Я знаю, что это старый, но ...
источник
Я создаю функцию, более похожую на substr, и использую идею @Dave.
Ps .: Полная длина реза может быть меньше, чем субстрат.
источник
Добавлены операторы IF / ELSEIF в код от Dave и AmalMurali для обработки строк без пробелов
источник
Я считаю это работает:
функция abbreviate_string_to_whole_word ($ строка, $ max_length, $ буфер) {
}
Буфер позволяет регулировать длину возвращаемой строки.
источник
Использовать это:
следующий код удалит ','. Если у вас есть какой-либо другой символ или подстрока, вы можете использовать это вместо ','
// если у вас есть другая строковая учетная запись для
источник
Хотя это довольно старый вопрос, я решил предоставить альтернативу, поскольку он не был упомянут и действителен для PHP 4.3+.
Вы можете использовать
sprintf
семейство функций для усечения текста, используя%.ℕs
модификатор точности.Простое усечение https://3v4l.org/QJDJU
результат
Расширенное усечение https://3v4l.org/FCD21
Так как
sprintf
функции аналогичныsubstr
и будут частично обрезать слова. Приведенный ниже подход гарантирует, что слова не будут обрезаны с помощьюstrpos(wordwrap(..., '[break]'), '[break]')
специального разделителя. Это позволяет нам получить позицию и убедиться, что мы не совпадаем со стандартными структурами предложений.Возврат строки без частичной обрезки слов, который не превышает заданную ширину, при сохранении разрыва строки при желании.
результат
Результаты с использованием
wordwrap($string, $width)
илиstrtok(wordwrap($string, $width), "\n")
источник
Я использовал это раньше
источник
Здесь вы можете попробовать это
источник
Я считаю, что это самый простой способ сделать это:
Я использую специальные символы, чтобы разделить текст и вырезать его.
источник
Может быть, это кому-нибудь поможет
источник