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.
Функции изменения регистра
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 имена тегов и атрибутов не зависят от регистра символов, так что, например, запись