Он-лайн консультация по вопросам сопровождения сайта в Ульяновске: ICQ# 179104682
Как обрезать кириллическую строку с помощью PHP
Дата размещения статьи: 01.06.2014
Создание сайта в Ульяновске с серьезным функционалом и взаимодействием с базами данных очень часто требует, чтобы определенная строка не превышала определенного заданного объема. Это может понадобиться, например, для ограничения количества символов, передающихся серверу баз данных с помощью поля input, для отображения на странице сайта только части строки (например, при формировании равных по высоте анонсов новостей в списке) и для многих других задач.
Первое, на что натыкаются начинающие программисты – PHP функция substr. Она действительно используется для обрезки строк и синтаксис ее несложен substr(string, int start [, int length] ), где int start – начальный символ с которого нужно начать резать строку, а необязательный параметр int length – количество символов, которые нужно отрезать. Однако, для неопытного программиста она может показаться странной, если он пытается использовать ее для PHP обрезки строки с кириллицей. В результате работы substr с кириллической строкой на конце обрезанной строки может появиться знак вопроса, или знак вопроса в ромбике, а общее число вырезанных символов почему-то в два раза меньше того, что было задано в параметре int length. Почему же так происходит?
Дело в том русскоязычные символы в UTF-8 имеют размер в 2 байта, а латинские символы всего 1 байт. PHP функция substr режет строку именно по байтам, а не по символам. Если строка состоит из латинских символов, то ничего странного не происходит, так как число символов совпадает с числом байтов. А при работе с кириллицей, где каждый символ занимает 2 байта, параметр int length запросто может попасть на «середину» символа, и в результате на конце вырезанной строки при выводе мы увидим тот злополучный знак вопроса в ромбике.
Как правильно вырезать часть строки с кириллицей?
Решение этой проблемы на самом деле очень простое. Для правильной PHP обрезки строки, содержащей кириллические символы нужно использовать PHP функцию iconv_substr
Синтаксис функции несложный:
iconv_substr ( string, int start [, int length [, charset]] )
Пример для обрезки русскоязычной строки до 80 символов с UTF-8 кодировкой с помощью iconv_substr:
$new_string = iconv_substr ($string, 0 , 80 , “UTF-8” );
Цифра ноль в примере означает что отсчет 80 символов начинается с самого начала строки.