Преобразование первых букв в заглавные(верхний регистр) - PHP. Преобразование первых букв в заглавные(верхний регистр) - PHP Php строчные буквы




11 years ago

Note that mb_strtolower() is very SLOW, if you have a database connection, you may want to use it to convert your strings to lower case. Even latin1/9 (iso-8859-1/15) and other encodings are possible.

Have a look at my simple benchmark:

$text = "Lörem ipßüm dölör ßit ämet, cönßectetüer ädipißcing elit. Sed ligülä. Präeßent jüßtö tellüß, grävidä eü, tempüß ä, mättiß nön, örci. Näm qüiß lörem. Näm äliqüet elit ßed elit. Phäßellüß venenätiß jüßtö eget enim. Dönec nißl. Pröin mättiß venenätiß jüßtö. Sed äliqüäm pörtä örci. Cräß elit nißl, cönvälliß qüiß, tincidünt ät, vehicülä äccümßän, ödiö. Sed möleßtie. Etiäm mölliß feügiät elit. Veßtibülüm änte ipßüm primiß in fäücibüß örci lüctüß et ültriceß pößüere cübiliä Cüräe; Mäecenäß nön nüllä." ;

// mb_strtolower()
$timeMB = microtime (true );

For($i = 0 ; $i < 30000 ; $i ++)
$lower = mb_strtolower (" $text /no-cache- $i " );

$timeMB = microtime (true ) - $timeMB ;

// MySQL lower()
$timeSQL = microtime (true );

Mysql_query ("set names latin1" );
for($i = 0 ; $i < 30000 ; $i ++) {
$r = mysql_fetch_row (mysql_query ("select lower(" $text /no-cache- $i ")" ));
$lower = $r [ 0 ];
}

$timeSQL = microtime (true ) - $timeSQL ;

echo "mb: " . sprintf ("%.5f" , $timeMB ). " sek.
" ;
echo "sql: " . sprintf ("%.5f" , $timeSQL ). " sek.
" ;

// Result on my notebook:
// mb: 11.50642 sek.
// sql: 5.44143 sek.

?>

7 years ago

Please, note that when using with UTF-8 mb_strtolower will only convert upper case characters to lower case which are marked with the Unicode property "Upper case letter" ("Lu"). However, there are also letters such as "Letter numbers" (Unicode property "Nl") that also have lower case and upper case variants. These characters will not be converted be mb_strtolower!

Example:
The Roman letters Ⅰ, Ⅱ, Ⅲ, ..., Ⅿ (UTF-8 code points 8544 through 8559) also exist in their respective lower case variants ⅰ, ⅱ, ⅲ, ..., ⅿ (UTF-8 code points 8560 through 8575) and should, in my opinion, also be converted by mb_strtolower, but they are not!

Big internet-companies (like Google) do match both variants as semantically equal (since the representations only differ in case).

Since I was not finding any proper solution in the internet on how to map all UTF8-strings to their lowercase counterpart in PHP, I offer the following hard-coded extended mb_strtolower function for UTF-8 strings:

The function wraps the existing function mb_strtolower() and additionally replaces uppercase UTF8-characters for which there is a lowercase representation. Since there is no proper Unicode uppercase and lowercase character-table in the internet that I was able to find, I checked the first million UTF8-characters against the Google-search and -KeywordTool and identified the following 78 characters as uppercase-characters, not being replaced by mb_strtolower, but having a UTF8 lowercase counterpart.

//the numbers in the in-line-comments display the characters" Unicode code-points (CP).
function strtolower_utf8_extended ($utf8_string )
{
$additional_replacements = array
("Dž" => "dž" // 453 -> 454
, "Lj" => "lj" // 456 -> 457
, "Nj" => "nj" // 459 -> 460
, "Dz" => "dz" // 498 -> 499
, "Ϸ" => "ϸ" // 1015 -> 1016
, "Ϲ" => "ϲ" // 1017 -> 1010
, "Ϻ" => "ϻ" // 1018 -> 1019
, "ᾈ" => "ᾀ" // 8072 -> 8064
, "ᾉ" => "ᾁ" // 8073 -> 8065
, "ᾊ" => "ᾂ" // 8074 -> 8066
, "ᾋ" => "ᾃ" // 8075 -> 8067
, "ᾌ" => "ᾄ" // 8076 -> 8068
, "ᾍ" => "ᾅ" // 8077 -> 8069
, "ᾎ" => "ᾆ" // 8078 -> 8070
, "ᾏ" => "ᾇ" // 8079 -> 8071
, "ᾘ" => "ᾐ" // 8088 -> 8080
, "ᾙ" => "ᾑ" // 8089 -> 8081
, "ᾚ" => "ᾒ" // 8090 -> 8082
, "ᾛ" => "ᾓ" // 8091 -> 8083
, "ᾜ" => "ᾔ" // 8092 -> 8084
, "ᾝ" => "ᾕ" // 8093 -> 8085
, "ᾞ" => "ᾖ" // 8094 -> 8086
, "ᾟ" => "ᾗ" // 8095 -> 8087
, "ᾨ" => "ᾠ" // 8104 -> 8096
, "ᾩ" => "ᾡ" // 8105 -> 8097
, "ᾪ" => "ᾢ" // 8106 -> 8098
, "ᾫ" => "ᾣ" // 8107 -> 8099
, "ᾬ" => "ᾤ" // 8108 -> 8100
, "ᾭ" => "ᾥ" // 8109 -> 8101
, "ᾮ" => "ᾦ" // 8110 -> 8102
, "ᾯ" => "ᾧ" // 8111 -> 8103
, "ᾼ" => "ᾳ" // 8124 -> 8115
, "ῌ" => "ῃ" // 8140 -> 8131
, "ῼ" => "ῳ" // 8188 -> 8179
, "Ⅰ" => "ⅰ" // 8544 -> 8560
, "Ⅱ" => "ⅱ" // 8545 -> 8561
, "Ⅲ" => "ⅲ" // 8546 -> 8562
, "Ⅳ" => "ⅳ" // 8547 -> 8563
, "Ⅴ" => "ⅴ" // 8548 -> 8564
, "Ⅵ" => "ⅵ" // 8549 -> 8565
, "Ⅶ" => "ⅶ" // 8550 -> 8566
, "Ⅷ" => "ⅷ" // 8551 -> 8567
, "Ⅸ" => "ⅸ" // 8552 -> 8568
, "Ⅹ" => "ⅹ" // 8553 -> 8569
, "Ⅺ" => "ⅺ" // 8554 -> 8570
, "Ⅻ" => "ⅻ" // 8555 -> 8571
, "Ⅼ" => "ⅼ" // 8556 -> 8572
, "Ⅽ" => "ⅽ" // 8557 -> 8573
, "Ⅾ" => "ⅾ" // 8558 -> 8574
, "Ⅿ" => "ⅿ" // 8559 -> 8575
, "Ⓐ" => "ⓐ" // 9398 -> 9424
, "Ⓑ" => "ⓑ" // 9399 -> 9425
, "Ⓒ" => "ⓒ" // 9400 -> 9426
, "Ⓓ" => "ⓓ" // 9401 -> 9427
, "Ⓔ" => "ⓔ" // 9402 -> 9428
, "Ⓕ" => "ⓕ" // 9403 -> 9429
, "Ⓖ" => "ⓖ" // 9404 -> 9430
, "Ⓗ" => "ⓗ" // 9405 -> 9431
, "Ⓘ" => "ⓘ" // 9406 -> 9432
, "Ⓙ" => "ⓙ" // 9407 -> 9433
, "Ⓚ" => "ⓚ" // 9408 -> 9434
, "Ⓛ" => "ⓛ" // 9409 -> 9435
, "Ⓜ" => "ⓜ" // 9410 -> 9436
, "Ⓝ" => "ⓝ" // 9411 -> 9437
, "Ⓞ" => "ⓞ" // 9412 -> 9438
, "Ⓟ" => "ⓟ" // 9413 -> 9439
, "Ⓠ" => "ⓠ" // 9414 -> 9440
, "Ⓡ" => "ⓡ" // 9415 -> 9441
, "Ⓢ" => "ⓢ" // 9416 -> 9442
, "Ⓣ" => "ⓣ" // 9417 -> 9443
, "Ⓤ" => "ⓤ" // 9418 -> 9444
, "Ⓥ" => "ⓥ" // 9419 -> 9445
, "Ⓦ" => "ⓦ" // 9420 -> 9446
, "Ⓧ" => "ⓧ" // 9421 -> 9447
, "Ⓨ" => "ⓨ" // 9422 -> 9448
, "Ⓩ" => "ⓩ" // 9423 -> 9449
, "𐐦" => "𐑎" // 66598 -> 66638
, "𐐧" => "𐑏" // 66599 -> 66639
);

$utf8_string = mb_strtolower ($utf8_string , "UTF-8" );

$utf8_string = strtr ($utf8_string , $additional_replacements );

Return $utf8_string ;
} //strtolower_utf8_extended()

PHP хорош многообразием нативных функций языка. Однако, в некоторых случаях приходится дописывать недостающий функционал. Особенно это заметно при работе с функциями преобразования строк и различными кодировками.

Например, ucfirst - функция, которая преобразовывает первый символ строки в верхний регистр. Казалось бы, не должно возникнуть никаких проблем, но при работе с кириллицей такого преобразования не происходит. Это касается и функции ucwords - преобразует в верхний регистр первый символ каждого слова в строке.

С символами анг.алфавита проблем не возникает:

"; //преобразует в верхний регистр первый символ каждого слова в строке echo ucwords($str); ?>

Test string Test String

Но с кириллицей возникают проблемы:

"; //преобразует в верхний регистр первый символ каждого слова в строке echo ucwords($str); ?>

Тестовая строка тестовая строка

Для PHP типичны случаи, когда функции "плохо" или вообще не работают с кириллицей. Некоторые функции с приставкой mb решают проблемы с кириллицей. Например, mb_strtolower - приведение строки к нижнему регистру. В отличие от strtolower(), то что символ является буквой определяется на основании свойств символа Юникода.

Для решения проблемы определим функцию mb_ucfirst(string str [, string encoding]), которая будет обрабатывать символы Юникода.

Для преобразует в верхний регистр первый символ каждого слова в строке достаточно использовать mb_convert_case в режиме MB_CASE_TITLE.

Производит преобразование символов строки в нижний регистр.

Синтаксис:

String strtolower(string str);

Преобразует строку в нижний регистр. Возвращает результат перевода.

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

$str = "HeLLo World"; $str = strtolower($str); echo $str; // выведет hello world

strtoupper

Производит преобразование заданной строки в верхний регистр.

Синтаксис:

String strtoupper(string str);

Переводит строку в верхний регистр. Возвращает результат преобразования. Эта функция хорошо работает с английскими буквами, но с русскими может чудить.

$str = "Hello World"; $str = strtoupper($str); echo $str; // выведет HELLO WORLD

ucfirst

Производит преобразование первого символа строки в верхний регистр.

Синтаксис:

String ucfirst(string str);

Возвращает строку, у которой первый символ заглавный.

$str = "hello world"; $str = ucfirst($str); echo $str; // выведет Hello world

ucwords

Производит преобразование первого символа каждого слова строки в верхний регистр.

Синтаксис:

String ucwords(string str);

Возвращает строку, у которой первый символ каждого слова в строке заглавный.

Под словом здесь понимается участок строки, которому предшествует пробельный символ: пробел, переход на новую строку, прогонка страницы, возврат каретки, горизонтальная и вертикальная табуляция.

Символы кириллицы могут быть неправильно конвертированы.

$str = "hello world"; $str = ucfirst($str); echo $str; // выведет Hello World

Функции изменения регистра

strtolower

Производит преобразование символов строки в нижний регистр.

Синтаксис:

string strtolower(string str);

Преобразует строку в нижний регистр. Возвращает результат перевода.

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

$str = "HeLLo World";

$str = strtolower($str);

// выведет hello world

strtoupper

Производит преобразование заданной строки в верхний регистр.

Синтаксис:

string strtoupper(string str);

Переводит строку в верхний регистр. Возвращает результат преобразования. Эта функция хорошо работает с английскими буквами, но с русскими может чудить.

$str = "Hello World";

$str = strtoupper($str);

// выведет HELLO WORLD

Производит преобразование первого символа строки в верхний регистр.

Синтаксис:

string ucfirst(string str);

Возвращает строку, у которой первый символ заглавный.

$str = "hello world";

$str = ucfirst($str);

// выведет Hello world

Производит преобразование первого символа каждого слова строки в верхний регистр.

Синтаксис:

string ucwords(string str);

Возвращает строку, у которой первый символ каждого слова в строке заглавный.

Под словом здесь понимается участок строки, которому предшествует пробельный символ: пробел, переход на новую строку, прогонка страницы, возврат каретки, горизонтальная и вертикальная табуляция.

Символы кириллицы могут быть неправильно конвертированы.

$str = "hello world";

$str = ucfirst($str);

// выведет Hello World

Из книги Энциклопедия разработчика модулей ядра Linux автора Померанц Ори

Из книги Человеческий фактор в программировании автора Константин Ларри Л

54 Агенты изменения Одна рыба, сделав правильное движение в нужный момент, может изменить курс всего косяка. В группе, разрабатывающей программное обеспечение, успешность введения нового инструмента или улучшенного метода управления версиями часто зависит от

Из книги Эффективное использование STL автора Мейерс Скотт

Совет 35. Реализуйте простые сравнения строк без учета регистра символов с использованием mismatch или lexicographical_compare Один из вопросов, часто задаваемых новичками в STL - «Как в STL сравниваются строки без учета регистра символов?» Простота этого вопроса обманчива. Сравнения

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Сравнение строк без учета регистра символов Мэтт ОстернЕсли вам когда-либо доводилось писать программы, в которых используются строки (а кому, спрашивается, не доводилось?), скорее всего, вы встречались с типичной ситуацией - две строки, различающиеся только регистром

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Из книги Технология XSLT автора Валиков Алексей Николаевич

Изменения и постоянство Разработка ПО, как уже упоминалось, во многом связана с повторяемостью. Для понимания технической трудности повторного использования, следует понять природу повторяемости. Несмотря на то, что программисты обычно время от времени повторяют одни и

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

11.8.2 Перемещения и изменения Что произойдет, если пользователь переместит компьютер в другое место, подключив его к иной сети или подсети? Во время загрузки компьютер, использующий DHCP, автоматически изменит свой IP-адрес и маску подсети, а также при необходимости -

Из книги C++. Сборник рецептов автора Диггинс Кристофер

22.10.3 Изменения в DNS Новый тип записи о ресурсе, AAAA, отображает имена доменов в адреса IP версии 6. Пример такой записи:MICKEY IN AAAA 4321:0:1:2:3:4:567:89ABДолжен быть обеспечен и обратный просмотр. Для преобразования адресов в имена для IPv6 потребуется добавить новые домены. Обратный поиск

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Из книги Офисный компьютер для женщин автора Пастернак Евгения

Изменения в XPath 2.0 Разрабатываемая версия языка XPath, вследствие интеграции с XQuery, очевидно, претерпит серьезные изменения. Новая спецификация уже сейчас разбита на два документа: документ, описывающий модель данных и документ, описывающий функции и операторы. Поэтому на

Из книги HTML, XHTML и CSS на 100% автора Квинт Игорь

11.7.2. Изменения в коде Как только в parseCommand() будут правильно отражены структуры данных, то запуск команд в правильном порядке становится довольно простым при достаточном внимании к деталям. Прежде всего, мы добавляем цикл в parseCommand() для запуска дочерних процессов,

Из книги автора

4.13. Выполнение сравнения строк без учета регистра ПроблемаИмеются две строки и требуется узнать, не равны ли они, не учитывая регистр их символов. Например, «cat» не равно «dog», но «Cat» должна быть равна «cat», «CAT» или «caT».РешениеСравните строки, используя стандартный

Из книги автора

4.14. Выполнение поиска строк без учета регистра ПроблемаТребуется найти в строке подстроку, не учитывая разницу в регистре.РешениеИспользуйте стандартные алгоритмы transform и search, определенные в , а также свои собственные функции сравнения символов, аналогичные

Из книги автора

8.1.8. Игнорирование регистра символов По умолчанию команда grep чувствительна к изменению регистра символов. Чтобы провести поиск без учета регистра, воспользуйтесь опцией -i. В файле data.f обозначение месяца Sept встречается как в верхнем, так и в нижнем регистре. Поэтому для

Из книги автора

Изменения Если изменений в документе много, удобно пользоваться этой группой кнопок.Например, вы видите исправление, и вы с ним согласны. Ставите в него курсор и нажимаете кнопку Принять. Выделение исправления пропадает, и оно органично вписывается в ваш текст.У этой

Из книги автора

Назначение имен тегов и атрибутов зависит от регистра В документах HTML имена тегов и атрибутов не зависят от регистра символов, так что, например, запись

,
или
означает один и тот же тег таблицы. Однако в XHTML это разные теги. То же самое касается имен

В PHP переменные и константные имена чувствительны к регистру, а имена функций – нет.

Насколько мне известно, PHP – это единственный язык, на котором это происходит. Все остальные языки, которые я использовал, либо полностью чувствительны к регистру, либо полностью нечувствительны к регистру.

Почему PHP частично относится к senstive?

Обратите внимание, что я не спрашиваю, какие имена чувствительны к регистру, но почему .

С учетом регистра

  • переменные
  • константы
  • клавиши массива
  • свойства класса
  • константы класса

Нечувствительность к регистру (как определено пользователем, так и PHP)

  • функции
  • конструкторы классов
  • методы класса
  • ключевые слова и конструкции (if, else, null, foreach, echo и т. д.)

основы

Переменные в PHP представлены знаком доллара, за которым следует имя переменной. Имя переменной чувствительно к регистру.

Имена переменных следуют тем же правилам, что и другие метки в PHP. Правильное имя переменной начинается с буквы или подчеркивания, за которой следует любое количество букв, цифр или символов подчеркивания. В качестве регулярного выражения оно выражается следующим образом: "*"

  1. Руководство пользователя для пользователей
  2. Почему функции и методы в PHP нечувствительны к регистру?
  3. Являются ли функции PHP чувствительными к регистру?
  4. Являются ли ключевые слова PHP чувствительными к регистру?
  5. Являются ли имена функций PHP чувствительными к регистру или нет?
  6. Источник чувствительности к PHP

Деликатный случай

переменные, константы, ключи массива, свойства класса, константы класса

Без учета регистра

функции, конструкторы классов, методы класса, ключевые слова и конструкции (if, else, null, foreach, echo и т. д.),

Для имен файлов:

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

Когда вы разрабатываете что-то на своем WAMP или XAMPP это будет нечувствительным к регистру, когда вы перейдете на сервер Linux он будет вызывать ошибку.

Почему PHP частично относится к senstive?

Я могу только предположить, что это связано с очень ранними версиями, возможно, с PHP / FI 2.0. В руководстве явно указано:

Имейте в виду, что имена функций PHP / FI не чувствительны к регистру.

Большинство пользовательских данных, таких как параметры GET и POST, всегда были зарегистрированы как глобальные переменные. Рассмотрение этих вопросов как нечувствительных к регистру, вероятно, вызвало бы проблемы, и, предположительно, поэтому все переменные рассматривались как чувствительные к регистру.

Из того, что я могу сказать, это были единственные типы идентификаторов в PHP / FI 2.0. Все остальные были представлены позже, видимо, имитируя имена функций, не учитывающих регистр.

Константы, которые являются особыми, были введены только с PHP 4 (руководство PHP 3 упоминает «константы», но в настоящее время они называются «литералами»). По какой-то загадочной причине (возможно, консенсуса не удалось найти) было принято решение разрешить постоянным идентификаторам define() d либо чувствительным к регистру, либо нечувствительным к отклонению разработчиков. Интересно отметить, что в то время как define() умолчанию использует чувствительные к регистру константы, соответствующие C-копии (REGISTER_*_CONSTANT) по умолчанию нечувствительны к регистру.