- Функция ucwords не работает с кириллицей и не преобразует в верхний регистр первый символ каждого слова
- Замена регистра в строках PHP
- Проверка, является ли буква прописной или строчной
- Первая заглавная буква
- Для UTF-8:
- Первая строчная
- Для UTF-8:
- Все заглавные буквы
- Для UTF-8:
- Все строчные буквы
- Для UTF-8:
- Заглавная буква в каждом слове
- Для UTF-8:
- Инверсия регистра
- Комментарии 1
- PHP: перевод первого символа каждого слова в верхний регистр для кодировки UTF-8
Функция ucwords не работает с кириллицей и не преобразует в верхний регистр первый символ каждого слова
Помогите решить такую задачу!
есть переменная ($search) она выводит на сайте зоголовки (титлы) у меня возникла такая задача
если заголовок вида
(tree home)
то добавив функцию (ucwords)
вот исправно работующий пример для латиницы!
$search = ucwords($search); // переводит первую букву каждого слова в верхний регистр, для латиницы!
теперь в тит будет выводить вот так
(Tree Home)
делая заглавными первые буквы каждого слова, все это прекрасно работает так как мне нужно но только с латиницей, а вот
с кириллицей функция (ucwords) не хочет работать, и каждое слово остается с маленькой буквы
поиск в интернет помог найти вот такой код который будет работать и с кириллицей который я переделал под себя
$search = mb_strtoupper(mb_substr($search, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($search, 1, mb_strlen($search), 'UTF-8'); // переводит первую букву слова в верхний регистр, для кириллицы!
но тут есть одна проблема, если заголовок который в базе данных вида (все слова с маленькой буквы)
то выводит в титле тогда так (Все слова с маленькой буквы) заменяя только первую букву на заглавную, а нужно чтобы вывадило
заглавными все слова в титл, вот так (Все Слова С Маленькой Буквы)
Пмогите пожалуйста решить эту проблему с этим кодом!
$search = mb_strtoupper(mb_substr($search, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($search, 1, mb_strlen($search), 'UTF-8'); // переводит первую букву слова в верхний регистр, для кириллицы!
Замена регистра в строках PHP
Список PHP-функций для изменения регистра символов в строках и примеры их использования.
Проверка, является ли буква прописной или строчной
Функция ctype_upper($string) – определяет, являются ли все буквы в строке в верхнем регистре.
$str = 'Ы'; if (ctype_upper($str)) < echo 'Заглавная'; >else
Вариант для кириллицы в кодировке UTF-8:
$str = 'Ы'; if (mb_strtolower($str) !== $str) < echo 'Заглавная'; >else < echo 'строчная'; >// Выведется «Заглавная»
Пример определения регистра для первой буквы в строке:
$text = 'Привет мир!'; $chr = mb_substr($text, 0, 1); if (mb_strtolower($chr) !== $chr) < echo 'Заглавная'; >else < echo 'строчная'; >// Выведется «Заглавная»
Первая заглавная буква
ucfirst($string) — преобразует первый символ строки в верхний регистр.
$text = 'привет Мир!'; echo ucfirst($text);
Для UTF-8:
if(!function_exists('mb_ucfirst')) < function mb_ucfirst($str) < $fc = mb_strtoupper(mb_substr($str, 0, 1)); return $fc . mb_substr($str, 1); >> $text = 'привет Мир!'; echo mb_ucfirst($text); // Привет Мир!
Первая строчная
ucfirst($string) — преобразует первый символ строки в верхний регистр.
$text = 'Привет Мир!'; echo lcfirst($text);
Для UTF-8:
if(!function_exists('mb_lcfirst')) < function mb_lcfirst($str) < $fc = mb_strtolower(mb_substr($str, 0, 1)); return $fc . mb_substr($str, 1); >> $text = 'Привет Мир!'; echo mb_lcfirst($text); // привет Мир!
Все заглавные буквы
Для UTF-8:
$text = 'привет Мир!'; echo mb_strtoupper($text); // ПРИВЕТ МИР!
Все строчные буквы
$text = 'Привет Мир!'; echo strtolower($text);
Для UTF-8:
$text = 'Привет Мир!'; echo mb_strtolower($text); // привет мир!
Заглавная буква в каждом слове
$text = 'привет мир!'; echo ucwords($text);
Для UTF-8:
if(!function_exists('mb_ucwords')) < function mb_ucwords($str) < $str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8"); return ($str); >> $text = 'привет мир!'; echo mb_ucwords($text); // Привет Мир!
Инверсия регистра
function mb_flip_case($string) < $characters = preg_split('/(?$char) < if (mb_strtolower($char, "UTF-8") != $char) < $char = mb_strtolower($char, 'UTF-8'); >else < $char = mb_strtoupper($char, 'UTF-8'); >$characters[$key] = $char; > return implode('', $characters); > $text = 'Привет Мир!'; echo mb_flip_case($text); // пРИВЕТ мИР!
Комментарии 1
function invertCase($text)
$string = »;
/*
Решение №1
$mb_strlen = mb_strlen($text);
$i = $mb_strlen;
while ($i > 0) $i—;
$char = mb_substr($text, $i, 1);
$char = (mb_strtolower($char) === $char) ? mb_strtoupper($char) : mb_strtolower($char);
$string = $char.$string;
>
*/
// Решение №2
$arr = mb_str_split($text, 1);
foreach ($arr as $char) $char = (mb_strtolower($char) === $char) ? mb_strtoupper($char) : mb_strtolower($char);
$string .= $char;
>
return $string;
>
Авторизуйтесь, чтобы добавить комментарий.
PHP: перевод первого символа каждого слова в верхний регистр для кодировки UTF-8
Сегодняшняя статья может быть полезна пользователям, решившим реализовать собственными силами работу функции ucwords() , но работает это только с латинскими буквами. Данная функция переводит первый символ каждого слова в верхний регистр. Десятый вопрос, зачем такая штука нужна: я поставил задачу и решаю её доступными средствами. Если вдруг вам понадобилась сия фича — аве мне.
Для начала посмотрим, какие инструменты необходимы. Самое главное, нужен PHP версии 5.1.0 или выше, в них регулярным выражениям добавили расширенные последовательности для работы с UTF-8. И ещё одно важное условие — в списке расширений PHP должно быть mbstring; сразу отмечу, что данное расширение мне встречалось на всех хостингах, которыми пользовался.
Сперва решим, что будет являться словом. Слово — это последовательность букв (либо одна буква), которая начинает строку либо расположена после разделителей — пробельных символов или знаков пунктуации.
Нарушая предыдущие структуры статей, сразу привожу решение. Функция носит имя utf8_ucwords() . В качестве единственного параметра передаётся текст в кодировке UTF-8.
Вам необходимо единожды определить данную функцию. После этого преобразовывать строки можно хотя бы так:
$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! И Ещё Капля Текста.Как-То Так. */
Если возникнут вопросы, пожалуйста, задавайте в комментариях, постараюсь донести доступно.