Обрезание строк с помощью функций PHP

В данной статье мы рассмотрим пару разных методов в PHP обрезать строку на определенное число слов и символов. Большая часть возможностей, описанных в данной статье, используется, чтобы продемонстрировать функции PHP для работы со строками.

Во всех наших примерах мы будем использовать следующую строку, и будем исходить из того, что нам необходимо уменьшить число символов в строке со 187 до 120 символов( для Twitter).

Lorem ipsum velit inceptos posuere augue amet sagittis augue sapien gravida vestra nulla non hac ac luctus imperdiet pulvinar ligula hac elit molestie vestibulum fusce porttitor lacinia.

В нашем примере мы также используем вторую строку из 55 символов, чтобы вы могли проверить возвращаемый результат на более короткой строке.

mb_strimwidth()

mb_strimwidth() возвращает в PHP обрезанную строку по длине и добавляет конечные символы, указанные в возможности. Поскольку это одна из основных возможностей PHP, ее мы рассмотрим в первую очередь. Применяется она просто:

/* mb_strimwidth() http://php.net/manual/en/function.mb-strimwidth.phphttp://www.internoetics.com/2016/02/01/shorten-strings-whole-word-character-count-php/*/echo mb_strimwidth($string, 0, 120, '...');

Функцию рассматривает свободное пространство как символ. Но это значит, что между последним усеченным символом и конечным символом многоточием будет размещаться пробел. Вы можете без проблем обрезать строку без конечного символа, а далее добавить его отдельно. Посмотрите на следующий пример:

rtrim(mb_strimwidth($string, 0, 117)). '...';

Приведенный выше программный код добавляет многоточие не зависимо от того, была ли PHP обрезана строка до символа или нет. Чтобы исправить это, мы будем рассчитывать длину строки, и только после этого добавлять многоточие, если исходная строка действительно должна обрезаться. Например:

function internoetics_mb_strimwidth($string, $start = 0, $width = 120, $trimmarker = '...') { $len = strlen(trim($string)); $newstring =(($len > 120) &&($len!= 0))? rtrim(mb_strimwidth($string, $start, $width - strlen($trimmarker))). $trimmarker: $string; return $newstring;}/* Использование */echo internoetics_mb_strimwidth($string, 0, 120, $trimmarker = '...');

При отправке сообщений в Twitter и на иные ресурсы, где символы чувствительны к регистру, каждый символ имеет в себя значение… и эта функцию в ряде случаев сэкономит вам один пробел!

mb_substr()

Функцию PHP mb_substr() «получает часть строки«. Она возвращает подстроку на основе числа символов. Позиция обрезки отсчитывается от начала строки. Позиция первого символа равна 0. Позиция второго символа равна 1. И так далее.

/* mb_substr() http://php.net/manual/en/function.mb-substr.php*/echo mb_substr($string, 0, 120);

Чтобы добавить многоточие(или любой другой конечный символ), мы можем настроить первую возможность, которую рассматривали. Мы обрезаем строку перед добавлением $trimmarker, чтобы гарантировать, что у нас не будет добавляться в PHP обрезанной строке с конца лишний пробел.

function internoetics_mb_substr($string, $start = 0, $length = 120, $trimmarker = '...') { $len = strlen(trim($string)); $newstring =(($len > $length) &&($len!= 0))? rtrim(mb_substr($string, $start, $length - strlen($trimmarker))). $trimmarker: $string; return $newstring;}/* Применение */echo internoetics_mb_substr($string, 0, 120);

mb_substr(), substr() и mb_strcut()

mb_substr(), substr() и mb_strcut() — ещё пару возможностей, похожих на те, которые я описал выше. Они отличаются только тем, как обрабатываются многобайтовые наборы символов(китайский язык и т.д.).

Если вы выводите PHP обрезанную часть строки до ближайшего слова на основе числа символов(но без конечного многоточия), используйте следующий код:

echo substr($string, 0, strrpos(substr( $string, 0, 35), ' '));Изменив возможность, чтобы сейчас в конце добавлялись многоточие, мы получим следующее:/* Усеченный до ближайшего слова текст, основываясь на числе символов - substr() http://php.net/manual/en/function.substr.php*/function internoetics_string_strrpos($string, $length = 137, $trimmarker = '...') { $len = strlen(trim($string));         $newstring =($len > $length)? rtrim(substr($string, 0, strrpos(substr($string, 0, $length), ' '))). $trimmarker : $string; return $newstring;}/* Использование */echo internoetics_string_strrpos($string);

preg_match()

Вы редко найдете тех, кто предпочитает использовать регулярные выражения, когда есть так много отличных возможностей PHP . Тем не менее, вот функцию, которая обрезает строку до определенного символа в PHP , исходя из заданного числа знаков от начала. В отличие от иных возможностей, описанных выше, эта функцию обрезает строку до целого слова.

/* preg-match() http://php.net/manual/en/function.preg-match.php*/function internoetics_preg_string($string, $length, $trimmarker = '...') {  $strlen = strlen($string);  /* mb_substr добавляет принудительный разрыв в $length, если заданное число символов не включает окончания слова (пробела) */  $string = trim(mb_substr($string, 0, $strlen));  if ($strlen > $length) {   preg_match('/^.{1,' . ($length - strlen($trimmarker)) . '}b/su', $string, $match);   $string = trim($match['0']) . $trimmarker;    } else {   $string = trim($string);  } return $string;}/* Применение */echo internoetics_preg_string($string, 100, $trimmarker = '...');

Описание возможности

Функцию принимает три параметры: $string , $length и $trimmarker (многоточие или иные символы, которые добавляются в конце строки).

Строка 7

$strlen = strlen($string);

Первое, что мы делаем, это проверяем длину PHP обрезанной строки после символа. Если строка короче, чем $length , то мы возвращаем эту строку.

Строка 9

$string = trim(mb_substr($string, 0, $strlen));

Функцию mb_substr() прерывает строку в $length , если это число символов не включает окончания слова (пробела). Если мы передали строку длиною 500 символов и эта строка не включает пробелов, то будет возвращена вся строка (поскольку функцию preg_match не нашла окончания слова). На данный момент мы обрезаем строку таким образом, и возвращаем ее в полном объеме.

Строки 10, 11, и 12

Если длина нашей строки превышает максимальную длину, определенную в виде параметры возможности, мы выполняем регулярное выражение возможности preg_match() , чтобы вернуть часть строки до символа с номером $length , который определяется как конец слова ( ‘/^.{1,$length}b/s’ ). Знак периода означает любой символ, кроме символа новой строки ( n ). Фигурная скобка определяет диапазон, который задает, сколько символов должен PHP обрезать в строке. Таким образом {1,$length} означает от 1 до символа $length . Наконец, b означает, что шаблон будет соответствовать окончанию слова. Мы можем производить поиск только слов целиком по шаблону, который мы предоставили. И в конце s задает поиск всех пробелов.

Поскольку мы не хотим, чтобы возвращаемая строка превышала длину $length , максимальное число символов в возможности preg_match должно быть равно максимальной длине минус длина $trimmarke.r . Мы должны учитывать это.

Далее мы возвращаем либо усеченную строку, либо исходную строку, если она меньше заданной длины усечения.

strrpos()

Функцию strrpos() находит позицию последнего вхождения подстроки в строке. Она возвращает позицию, на которой располагается искомая подстрока относительно начала строки. Отметим также, что первая позиция в строке имеет в себя номер 0 — а не 1 , так что мы учитываем это в возможности, добавляя 1 к длине строки при применении возможности strrpos() .

/* strrpos() http://php.net/manual/en/function.strrpos.php*/function interneotics_short_string($string, $length, $trimmarker = '...') {  $len = strlen($string);  if ($len < $length) return $string;   else;  $string = substr($string, 0, $length + 1 - strlen($trimmarker));  $string = trim(substr($string, 0, strrpos($string, ' ') + 1 )) . $trimmarker; return $string;}/* Использование */echo interneotics_short_string($string, $length = 120);

wordwrap()

Использование wordwrap() — это ещё один метод, при помощи которого можно в PHP обрезать строку до пробела, хотя он не эффективен и не будет лучшим выбором (если только обстоятельства не требуют этого). Wordwrap оборачивает строку в заданное число символов с использованием символа разрыва строки. Применив возможность PHP explode() , мы можем построить массив из каждой строки текста. Мы определяем, нужен ли $trimmarker (конечное многоточие), запросив, пусто ли второе значение массива. Если пусто, то строка не оборачивается.

/* wordwrap() http://php.net/manual/en/function.wordwrap.php*/function internoetics_truncate_wordwrap($string, $length, $trimmarker = '...') {  $lines = explode("n", wordwrap($string, $length - strlen($trimmarker), "n", true));  $line = $lines['0'];  $result = ($lines['1'] != '') ? $line . $trimmarker : $line; return $result;}/* Использование */echo internoetics_truncate_wordwrap($string, 120, $trimmarker = '...');

Определение для параметры cut значения true означает, что строка оборачивается до или на указанном символе.

str-split()

Функцию str-split() может быть использована в приведенной выше возможности для преобразования строки в массив. str-split () не разбивает строку до целого слова. С ее помощью PHP обрезает последний символ в строке ровно до 120 знаков.

/* str-split() http://php.net/manual/en/function.str-split.php*/function internoetics_truncate_split($string, $length, $trimmarker = '...') {  $lines = str_split($string, $length - strlen($trimmarker));  $line = rtrim($lines['0']);  $result = ($lines['1'] != '') ? $line . $trimmarker : $line; return $result;}/* Использование */echo internoetics_truncate_split($string, 120);

Усечение по заданному числу слов

Ниже приведен пример PHP обрезки строки по числу символов, пробелов или слов. Это не слишком отличается от того, что мы делали. Далее мы сводим скорректированный массив в строку символов, максимальное число которых задается $limit . Мы добавляем $trimmarker (…) , если наш $limit меньше, чем число слов в массиве.

/* Возвращаем число слов, независимо от длины строки */$stringz = 'one two three four five six seven eight nine ten eleven twelve thirteen fourteen';function internoetics_truncate_words($string, $limit = 10, $trimmarker = '...') {  $count = str_word_count($string, 0);  $string = explode(' ', $string, $limit + 1);  array_pop($string);  $string = implode(' ', $string); return ($limit < $count) ? $string . $trimmarker : $string;}/* Использование */echo internoetics_truncate_words($stringz);

strtok()

Совместно применив strtok() и wordwrap() мы можем создать короткую, но эффективную возможность, которая будет в PHP обрезать строку до нужной длины. Как показано ниже, она не будет учитывать при усечении $length +$trimmarker . Но это удобно, если вы не слишком заботитесь о длине возвращаемой строки.

/*strtok()http://php.net/manual/en/function.strtok.php */function internoetics_strtok($string, $width = 120) { return strtok(wordwrap($string, $width, "...n"), "n");}/* Usage */echo internoetics_strtok($string);

Обрезка слов в WordPress

Для возврата обрезанного слова в WordPress используется wp_trim_words . Данная функцию часто применяется в сочетании с wp_strip_all_tags для очистки текста до его обработки. Конечно, есть и иные возможности, которые служат для той же цели.

Заключение

Мы могли бы написать ещё сотни примеров PHP обрезки строк, но когда-то необходимо остановиться. Возможности, приведенные в данной статье, являются частью ядра PHP , и вы можете использовать их для усечения строк. Хотя чаще всего программисты стараются избегать регулярных выражений, если иного выхода нет, вы можете прибегнуть и к их помощи.

В ряде примеров мы вернули $trimmarker, представляющий собой многоточие. При необходимости вы можете без проблем вернуть HTML-объект Ellipsis , для этого используется код …. Но лично я предпочитаю многоточие.

Скачать примеры

Скачать примеры из данной статьи вы можете без труда здесь .

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *