Пятница , 11 Октябрь 2024
ДомойПубликацииPHP: перевод первого символа каждого слова в верхний регистр для кодировки UTF-8

PHP: перевод первого символа каждого слова в верхний регистр для кодировки UTF-8

Привет-привет!

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

Для начала посмотрим, какие инструменты необходимы. Самое главное, нужен PHP версии 5.1.0 или выше, в них регулярным выражениям добавили расширенные последовательности для работы с UTF-8. И ещё одно важное условие — в списке расширений PHP должно быть mbstring; сразу отмечу, что данное расширение мне встречалось на всех хостингах, которыми пользовался.

ucwords для utf-8

Сперва решим, что будет являться словом. Слово — это последовательность букв (либо одна буква), которая начинает строку либо расположена после разделителей — пробельных символов или знаков пунктуации.

Нарушая предыдущие структуры статей, сразу привожу решение. Функция носит имя utf8_ucwords(). В качестве единственного параметра передаётся текст в кодировке UTF-8.

function utf8_ucwords($str) {
    $expr = '!(^|\pM|\pP|\pZ)(\pL)!mue';
    return preg_replace($expr, '"$1" . mb_strtoupper("$2", "UTF-8")', $str);
}

Вам необходимо единожды определить данную функцию. После этого преобразовывать строки можно хотя бы так:

$str = utf8_ucwords('привет, чувак!');

Теперь разберём подробно первую и вторую строку тела функции.

Параметр $expr являет собой регулярное выражение, которое получает значение первого символа каждого слова.

Символы, расположенные после восклицательного знака — m, u, e — устанавливают внутренние опции механизма регулярных выражения. Их назначение:

  • m — переданная строка воспринимается как набор строк (простите за тавтологию). Это означает, что нам требуется обработка символов переноса;
  • u — указывает, что анализируемый текст представлен в кодировке UTF-8;
  • e — специальная опция, которая принуждает интерпретировать второй параметр функции preg_replace() (о ней чуть позже) как код.

Символ ! (восклицательный знак) выступает в качестве разделителя. PHP, в отличие от Perl или JavaScript, не имеет встроенных инструкций для работы с регулярными выражениями, поэтому те представляются обычными строками.

Перейдём непосредственно к разбору знаков между ! и !. Выражение состоит из двух «карманов». Каждый «карман» потребуется описать особо.

Первый — (^|\pM|\pP|\pZ) — ищет символ, предваряющий «слово». Это может быть:

  • ^ — начало предложения или новой строки;
  • \pM — знак (пробельный, непробельный либо окружающий);
  • \pP — знак пунктуации;
  • \pZ — разделитель (строки или абзаца, либо пробельный).

По сути, так мы определяем начало слова.

Далее остаётся получить первый символ. За это отвечается второй «карман» — (\pL), который возвращает первую букву.

Важно использовать именно такой контекст. Модификатор u предписывает трактовать строку в кодировке UTF-8, а последовательность \pL возвращает первый символ слова. Для многобайтных кодировок это очень важно, ведь у них каждый символ может быть представлен несколькими байтами. Конечно, использование регулярных выражений, да ещё и с полным анализом строки, несколько замедлит ваш код. Но мы не собираемся работать с гигабайтами текста, верно?

Вторая строка тела функции возвращает результирующее значение. Мы используем функцию регулярных выражений:
preg_replace($expr, $ch, $str)
которая ищет в строке $str значение $expr, и заменяет его на $ch. Отличие от штатной str_replace() в том, что заменяется не жётско заданная строка, а значения, соответствующие условию, в данном случае — первая буква каждого слова.

Второй парметр функции, который призван заменять найденные значения, являет собой полноценный PHP код. В нём значение первого «кармана» $1 конкатенируется с результатом работы функции mb_strtoupper(), которая переводит букву в верхний регистр.

Небольшой пример, дабы вы могли ощутить в полной мере, о чём речь.

$str = 'это простое предложение, aga!
и ещё капля текста.как-то так.';
echo utf8_ucwords($str);
/*
Выведет:
Это Простое Предложение, Aga!
И Ещё Капля Текста.Как-То Так.
*/

Пользуйтесь на здоровье!

Если возникнут вопросы, пожалуйста, задавайте в комментариях, постараюсь донести доступно.

Рейтинг: 0

Автор публикации

2 070
не в сети 2 месяца

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (1 голосов, в среднем: 5,00 из 5)
Загрузка...

Оставить комментарий

Политика конфиденциальности

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

Принять