ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. Обрезка строки без разрыва слов

Обрезка строки без разрыва слов

Если у вас есть расширение php_mbstring то выполнить эту задачу можно с помощью функции mb_substr, которая корректно обрабатывает юникод. А вот если нет, можно воспользоваться альтернативным решением, резать по словам:
$text = 'Этот текст нужно обработать как нам нужно!';
$arr = explode( ' ', $text );
$arr = array_slice( $arr, 0, 5 );
$text = implode( ' ', $arr ).'...'; // Этот текст нужно обработать как ...
unset( $arr );
То есть мы сначала занесли в элементы массива весь текст, который был обработан функцией Explode, потом объединили 5 элементов этого массива в один, с помощью функции Array_slice, и перевели все в строку функцией Implode, которая объединила наших 5 элементов массива в один по знакам пробела.

С помощью данного кода мы получим первые 5 слов без обрыва в неожиданных местах.

Также для этих целей можно воспользоваться ниже описанной функцией, которая принимает значение строки и количества символов, которые нужно обрезать:
$text = 'Этот текст нужно обработать до определенного количества символов без разрыва слов!';
function textFunc( $str, $maxLen )
{
if ( mb_strlen( $str ) > $maxLen )
{
preg_match( '/^.{0,'.$maxLen.'} .*?/ui', $str, $match );
return $match[0].'...';
}
else {
return $str;
}
}
echo textFunc( $text, 50 ); // Этот текст нужно обработать до определенного...
Данную функцию можно изменить, например, чтобы считало не до символа пробела, а к символу ",". Для этого достаточно изменить регулярное выражение:
preg_match( '/^.{0,'.$maxLen.'};.*?/ui', $str, $match );
Данную функцию можно использовать при выводе результата поиска, или обрезки заголовка и во многих других случаях.

А теперь разберем реализацию разбиения текстовой строки на несколько вертикальных строк. По умолчанию в HTML текст автоматически умещается в определенное поле, но как быть, если необходимо вручную разбить строку на несколько вертикальных строк по высоте, чтобы они уместились в определенный блок при добавлении текста на изображение?

Чтобы реализовать данную задачу нам необходимо определить максимальное количество символов, которое умещается в блоке. Конечно, оно должно быть больше максимальной длины слова, например, минимум 15. Далее просто воспользуйтесь следующим скриптом, который разобьет строку вертикально без обрезки слов по символу пробела:
function textFunc( $str, $maxLen )
{
// Объявляем глобальную переменную для доступа извне функции:
global $result;
// Если строка длиной больше заданного для обрезки количества символов:
if ( mb_strlen( $str ) > $maxLen )
{
// Обрезаем строку регулярным выражением:
preg_match( '/^.{0,'.$maxLen.'} .*?/ui', $str, $match );
// Успешная обрезка:
if ( isset( $match[0] ) ) {
// Добавляем к результату обрезанную строку:
$result .= $match[0]."\r\n";
// Определяем оставшийся текст:
$endText = mb_substr( $str, mb_strlen( $match[0] ) );
// Если оставшееся строка длиной больше заданного для
// обрезки количества символов, выполняем снова функцию:
if ( mb_strlen( $endText ) > $maxLen ) {
textFunc( $endText, $maxLen );
}
else {
$result .= $endText;
}
}
}
else {
$result .= $str;
}
}
textFunc( 'Обрезка строки без разрыва слов', 15 );
Результат выполнения скрипта:
Обрезка строки 
без разрыва
слов
Функция использует рекурсию, остальное все подробно описано в комментариях к функции.

Добавить комментарий

Имя:
Текст комментария: