В этой статье мы рассмотрим несколько различных способов в PHP обрезать строку на определенное количество слов и символов. Большая часть функций, описанных в этой статье, используется, чтобы продемонстрировать возможности PHP для работы со строками.
Во всех наших примерах мы будем использовать следующую строку, и будем исходить из того, что нам нужно уменьшить количество символов в строке со 187 до 120 символов ( для Twitter) .
В нашем примере мы также используем вторую строку из 55 символов, чтобы вы могли проверить возвращаемый результат на более короткой строке.
- mb_strimwidth()
- mb_substr()
- mb_substr(), substr() и mb_strcut()
- preg_match()
- Описание функции
- Строка 7
- Строка 9
- Строки 10, 11, и 12
- strrpos()
- wordwrap()
- str-split()
- Усечение по заданному количеству слов
- strtok()
- Обрезка слов в WordPress
- Заключение
- Скачать примеры
- Описание
- Список параметров
- Возвращаемые значения
- Смотрите также
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Смотрите также
- User Contributed Notes 9 notes
mb_strimwidth()
mb_strimwidth() возвращает в PHP обрезанную строку по длине и добавляет конечные символы, указанные в функции. Так как это одна из основных функций PHP , ее мы рассмотрим в первую очередь. Применяется она очень просто:
Функция рассматривает свободное пространство как символ. Но это значит, что между последним усеченным символом и конечным символом многоточием будет размещаться пробел. Вы можете обрезать строку без конечного символа, а затем добавить его отдельно. Посмотрите на следующий пример:
Приведенный выше код добавляет многоточие не зависимо от того, была ли PHP обрезана строка до символа или нет. Чтобы исправить это, мы будем рассчитывать длину строки, и только после этого добавлять многоточие, если исходная строка действительно должна обрезаться. Например:
При отправке сообщений в Twitter и на другие ресурсы, где символы чувствительны к регистру, каждый символ имеет значение… и эта функция в ряде случаев сэкономит вам один пробел!
mb_substr()
Функция PHP mb_substr() « получает часть строки «. Она возвращает подстроку на основе количества символов. Позиция обрезки отсчитывается от начала строки. Позиция первого символа равна 0 . Позиция второго символа равна 1 . И так далее.
Чтобы добавить многоточие ( или любой другой конечный символ ), мы можем изменить первую функцию, которую рассматривали. Мы обрезаем строку перед добавлением $trimmarker , чтобы гарантировать, что у нас не будет добавляться в PHP обрезанной строке с конца лишний пробел.
mb_substr(), substr() и mb_strcut()
mb_substr() , substr() и mb_strcut() — еще несколько функций, похожих на те, которые я описал выше. Они отличаются только тем, как обрабатываются многобайтовые наборы символов ( китайский язык и т.д. ).
Если вы выводите PHP обрезанную часть строки до ближайшего слова на основе количества символов ( но без конечного многоточия ), используйте следующий код:
preg_match()
Вы редко найдете тех, кто предпочитает использовать регулярные выражения, когда есть так много отличных функций PHP . Тем не менее, вот функция, которая обрезает строку до определенного символа в PHP , исходя из заданного количества знаков от начала. В отличие от других функций, описанных выше, эта функция обрезает строку до целого слова.
Описание функции
Функция принимает три параметра: $string , $length и $trimmarker ( многоточие или другие символы, которые добавляются в конце строки ).
Строка 7
Первое, что мы делаем, это проверяем длину PHP обрезанной строки после символа. Если строка короче, чем $length , то мы возвращаем эту строку.
Строка 9
Функция 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() .
wordwrap()
Использование wordwrap() — это еще один способ, с помощью которого можно в PHP обрезать строку до пробела, хотя он не очень эффективен и не является лучшим выбором (если только обстоятельства не требуют этого). Wordwrap оборачивает строку в заданное число символов с использованием символа разрыва строки. Применив функцию PHP explode() , мы можем построить массив из каждой строки текста. Мы определяем, нужен ли $trimmarker ( конечное многоточие ), запросив, пусто ли второе значение массива. Если пусто, то строка не оборачивается.
Определение для параметра cut значения true означает, что строка всегда оборачивается до или на указанном символе.
str-split()
Функция str-split() может быть использована в приведенной выше функции для преобразования строки в массив. str-split () не разбивает строку до целого слова. С ее помощью PHP обрезает последний символ в строке ровно до 120 знаков.
Усечение по заданному количеству слов
Ниже приведен пример PHP обрезки строки по количеству символов, пробелов или слов. Это не слишком отличается от того, что мы уже делали. Затем мы сводим скорректированный массив в строку символов, максимальное количество которых задается $limit . Мы добавляем $trimmarker (…) , если наш $limit меньше, чем количество слов в массиве.
strtok()
Совместно применив strtok() и wordwrap() мы можем создать короткую, но эффективную функцию, которая будет в PHP обрезать строку до нужной длины. Как показано ниже, она не будет учитывать при усечении $length +$trimmarker . Но это удобно, если вы не слишком заботитесь о длине возвращаемой строки.
Обрезка слов в WordPress
Для возврата обрезанного слова в WordPress используется wp_trim_words . Данная функция часто применяется в сочетании с wp_strip_all_tags для очистки текста до его обработки. Конечно, есть и другие функции, которые служат для той же цели.
Заключение
Мы могли бы написать еще сотни примеров PHP обрезки строк, но когда-то нужно остановиться. Функции, приведенные в этой статье, являются частью ядра PHP , и вы можете использовать их для усечения строк. Хотя чаще всего программисты стараются избегать регулярных выражений, если другого выхода нет, вы можете прибегнуть и к их помощи.
В ряде примеров мы вернули $trimmarker, представляющий собой многоточие. При необходимости вы можете вернуть HTML-объект Ellipsis , для этого используется код …. Но лично я предпочитаю многоточие.
Скачать примеры
Скачать примеры из этой статьи вы можете здесь .
Данная публикация представляет собой перевод статьи « Truncate (Shorten) Strings to the Nearest Whole Word or Character Count with Trailing Dots using PHP Functions » , подготовленной дружной командой проекта Интернет-технологии.ру
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
mb_substr — Возвращает часть строки
Описание
Корректно выполняет substr() для многобайтовых кодировок, учитывая количество символов. Позиция отсчитывается от начала str . Позиция первого символа — 0, второго — 1 и т.д.
Список параметров
Исходная строка ( string ) для получения подстроки.
Позиция символа str , с которой выделяется подстрока.
Максимальное количество символов возвращаемой подстроки ( string ). если не указан, то передается NULL, и извлекаются все символы до конца строки.
Параметр encoding представляет собой символьную кодировку. Если он опущен, вместо него будет использовано значение внутренней кодировки.
Возвращаемые значения
mb_substr() Возвращает не более length символов, начиная с позиции start исходной строки. str
Смотрите также
- mb_strcut() — Получение части строки
- mb_internal_encoding() — Установка/получение внутренней кодировки скрипта
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
mb_substr — Возвращает часть строки
Описание
Корректно выполняет substr() для многобайтовых кодировок, учитывая количество символов. Позиция отсчитывается от начала str . Позиция первого символа — 0, второго — 1 и т.д.
Список параметров
Исходная строка для получения подстроки.
Если start неотрицательный, возвращенная строка начнется с позиции start от начала строки str , начальный символ имеет индекс 0. К примеру, в строке ‘abcdef‘, символ в позиции 0 — это ‘a‘, символ в позиции 2 — ‘c‘ и т.д.
Если start отрицательный, возвращаемая строка начнется отсчитывая start символов с конца str .
Максимальное количество символов возвращаемой из str подстроки. Если не указан или равен NULL — извлекаются все символы до конца строки.
Параметр encoding представляет собой символьную кодировку. Если он опущен, вместо него будет использовано значение внутренней кодировки.
Возвращаемые значения
mb_substr() возвращает часть строки str , заданную параметрами start и length .
Список изменений
Версия | Описание |
---|---|
5.4.8 | Передача NULL в качестве length вернет все символы до конца строки. В более ранних версиях NULL интерпретировался как 0. |
Смотрите также
- mb_strcut() — Получение части строки
- mb_internal_encoding() — Установка/получение внутренней кодировки скрипта
User Contributed Notes 9 notes
Thanks Darien from /freenode #php for the following example (a little bit changed).
It just prints the 6th character of $string.
You can replace the digits by the same in japanese, chinese or whatever language to make a test, it works perfect.
( "UTF-8" );
$string = "0123456789" ;
$mystring = mb_substr ( $string , 5 , 1 );
echo $mystring ;
?>
(I couldn’t replace 0123456789 by chinese numbers for example here, because it’s automatically converted into latin digits on this website, look :
零一二三四
五六七八九)
Note: If borders are out of string — mb_string() returns empty _string_, when function substr() returns _boolean_ false in this case.
Keep this in mind when using "===" comparisions.
Example code:
( substr ( ‘abc’ , 5 , 2 ) ); // returns "false"
var_dump ( mb_substr ( ‘abc’ , 5 , 2 ) ); // returns ""
?>
It’s especially confusing when using mbstring with function overloading turned on.
I’m trying to capitalize only the first character of the string and tried some of the examples above but they didn’t work. It seems mb_substr() cannot calculate the length of the string in multi-byte encoding (UTF-8) and it should be set explicitly. Here is the corrected version:
function mb_ucfirst ( $str , $enc = ‘utf-8’ ) <
return mb_strtoupper ( mb_substr ( $str , 0 , 1 , $enc ), $enc ). mb_substr ( $str , 1 , mb_strlen ( $str , $enc ), $enc );
>
?>
cheers!
you can make mb_substr working faster with long strings with usage of ucs-2 encoding.
( ‘Content-Type: text/html; charset=utf-8’ );
echo ‘ ‘ ;
function test ( $string , $encoding = ‘utf8’ ) <
$t1 = microtime ( true );
$textlen = mb_strlen ( $string );
$substr_len = 3 ;
for( $i = 0 ; $i $textlen — $substr_len + 1 ; $i ++) <
$substr = mb_substr ( $string , $i , $substr_len );
>
echo ‘mb_substr, ‘ . $encoding . ‘: ‘ .( microtime ( true )- $t1 );
echo ‘ . check: ‘ ;
if( $encoding == ‘ucs2’ ) <
$substr = mb_convert_encoding ( $substr , ‘utf-8’ , ‘ucs2’ );
>
var_dump ( $substr );
echo ‘ .
‘ ;
echo ‘
‘ ;
>
$corpus_short = str_repeat ( ‘тест Тест ‘ , 1000 );
// it works likewise slowly with "test Test" with utf8
mb_internal_encoding ( ‘utf-8’ );
test ( $corpus_short );
$corpus_short_ucs2 = mb_convert_encoding ( $corpus_short , ‘ucs2’ , ‘utf-8’ );
mb_internal_encoding ( ‘ucs2’ );
test ( $corpus_short_ucs2 , ‘ucs2’ );
mb_substr, utf8: 0.26480984687805 . check: string(5) "ст " .
mb_substr, ucs2: 0.0048871040344238 . check: string(5) "ст " .
" )) <
$has [ ‘ascii’ ] = "ascii" ;
> else <
$has [ ‘binary’ ] = "binary" ;
>
>
mb_internal_encoding ( $current_encoding );
žščř" ;
echo print_r ( get_character_classes ( $string ), true );
?>
Array
(
[numeric] => numeric
[alpha] => alpha
[alphalower] => alphalower
[alphaupper] => alphaupper
[currency] => currency
[ascii] => ascii
[binary] => binary
)
A serious pitfall when using mb_substr() set to HTML-ENTITIES encoding is that the function performs a number of conversions before returning the value, the worst one being that html special characters are not just counted but decoded.
( "ISO-8859-1" ); echo mb_internal_encoding (), "
$a = ‘jüst ä " simple " 日本 test‘ ;
echo mb_substr ( $a , 0 ), "
" ;
// page source: jüst ä " simple " 日本 test
echo mb_substr ( $a , 0 , strlen ( $a ), ‘HTML-ENTITIES’ );
// page source: jüst ä " simple " 日本 test