Привет-привет!
Сегодняшняя статья может быть полезна пользователям, решившим реализовать собственными силами работу функции ucwords(), но работает это только с латинскими буквами. Данная функция переводит первый символ каждого слова в верхний регистр. Десятый вопрос, зачем такая штука нужна: я поставил задачу и решаю её доступными средствами. Если вдруг вам понадобилась сия фича — аве мне.
Для начала посмотрим, какие инструменты необходимы. Самое главное, нужен PHP версии 5.1.0 или выше, в них регулярным выражениям добавили расширенные последовательности для работы с UTF-8. И ещё одно важное условие — в списке расширений PHP должно быть mbstring; сразу отмечу, что данное расширение мне встречалось на всех хостингах, которыми пользовался.
Сперва решим, что будет являться словом. Слово — это последовательность букв (либо одна буква), которая начинает строку либо расположена после разделителей — пробельных символов или знаков пунктуации.
Нарушая предыдущие структуры статей, сразу привожу решение. Функция носит имя 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!
И Ещё Капля Текста.Как-То Так.
*/
Пользуйтесь на здоровье!
Если возникнут вопросы, пожалуйста, задавайте в комментариях, постараюсь донести доступно.
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц