Резка строк в UTF-8 в PHP

Время от времени в программизме для веб возникает задача обрезать строчку скажем на 1000 символов — чтобы было нечто типа «строка…» и «Читать далее» (как например сделано в этом блоге на слишком длинных заметках. Проблемы начинаются с резкой UTF-8 строк, потому что стандартная функция substr в этом отношении демотивирует — байта на каждый символ два, а она режет по одному… В результате может от какой-нибудь буквы «ё», остаться неприглядный однобайтовый служебный символ.

Если у вас есть расширение php_mbstring — нет проблем, там есть функция mb_substr, которая корректно обрабатывает юникод. А вот если нету (скажем, на высоконагруженных проектах интерпретатор PHP как правило максимально облегчён — без всяких лишних расширений) то уже сложнее. Однако, выход есть — не обязательно резать по буквам, можно резать по словам. Этот метод я случайно обнаружил в одном из рабочих проектов и просто поразился простоте и эффективности решения такой уже тривиальной задачи. Собственно, сабж:

$arr = explode(' ', $text);
$arr = array_slice($arr, 50);
$text = implode(' ', $arr[0]).'...';
unset($arr);

В результате у нас имеется выборка из 50 слов, которая выглядит куда лучше, чем разрыв слов в неожиданных местах.

Автор

Алекс Разгибалов

Сумасшедший мужчина, неопределённого возраста, наслаждающийся манией преследования. Паталогически недоверчив, эгоистичен, авторитарен. Вторичные диагнозы - программист и поц. Владеет английским языком на уровне около хренового разговорного. Также знаком с некоторыми другими языками. Интересуется всем и вся, за счёт чего в любой области знания являются поверхностными, неглубокими. Характер невыдержанный. Крепость - 55 градусов.

Резка строк в UTF-8 в PHP: 2 комментария

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

    1. Ну — тут да, вопрос сложный, согласен, там ведь надо оценить общую производительность при использовании mbstring и использовании стандартных функций. Просто именно в том фишка, что на сервере фронта как правило ничего лишнего, и подобная мера вынужденная. У нас вообще весь основной контент — публикуется заранее, в статику, а затем простейший шаблонизатор на фронте подключает все эти статические файлы, в зависимости от урла запроса и нескольких других параметров. Соответственно обрезка строк используется в шаблонизаторе именно таким образом как раз в силу перечисленных причин — так как часть контента всё-таки динамическая, а PHP там максимально упрощённый.

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

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

Собирать идеально - не обязательно, просто приблизительно соберите картинку (должен быть включен JavaScript).WordPress CAPTCHA