regexp with russian lang
Note that the STAR in your regex is redundant. Everything already gets «eaten» by the PLUS. This would do the same:
I think you meant \x<0401>-\x for russian words. A indeed is the first character in the russian alphabet, but not in the unicode range. Check the unicode table here 0401>
@Iulian Onofrei, yeah, I indeed see \x <0401>in there, but don’t see the range \x-\x . Should it then be [\x<0401>\x-\x] , or really [\x<0401>-\x] ? Feel free to edit, of course!0401>
@BartKiers, yes, you’re wright. I missed that. I think the correct solution is: [\x<0430>-\x\x] for lowercase letters and [\x\x-\x] for uppercase letters.0430>
The common unicode script (supported since pcre 3.3) provides a test for the property Cyrillic.
e.g. replace all characters that are neither cyrillic nor (latin) digits:
$string = '1a2b3cйdцeуfкбxюy'; echo preg_replace('/[^0-9\p]/u', '*', $string);
You can find the documentation for that feature under http://www.pcre.org/pcre.txt «Unicode character properties».
And you have to specify the PCRE8 flag (u) as described at http://docs.php.net/reference.pcre.pattern.modifiers
Afaik there are no (technical) differences between the «common» scripts and specifying the ranges «manually». So it’s only a matter of choice. Except maybe that the property names are a bit more self-documenting.
I have tested in all the browsers including Safari
Among the most used alphabet in the internet.
This works since a good while now, I believe since php 5.6.
// Filter Chinese and Japanese HAN if (preg_match("/\p+/u", " 余TEST杭丽人广播", $match)) // Filter Cyrilic if (preg_match("/\p/u", "Күңел радиосы ", $match)) // Filter Greek if (preg_match("/\p/u", "Πρακτορείο ", $match)) // Filter Arabic if (preg_match("/\p/u", "مشال راډیو", $match)) // Filter Armenian if (preg_match("/\p/u", "Ազատություն ", $match)) // Filter Thai if (preg_match("/\p/u", "สวท.พะเยา", $match)) // Filter Georgian if (preg_match("/\p/u", "რადიო თავისუფალი", $match)) /* Output: */ /* CHINESE, JAPANESE RUSSIAN GREEK ARABIC ARMENIAN THAI GEORGIAN */
Please add some explanation to your answer such that others can learn from it. As far as I see, the OP did not ask for a regular expression to detect a language
PHP. Кириллица в регулярных выражениях
Автор: Роман Чернышов Опубликовано: 13 ноября 2010
Столкнулся я с проблемой, а именно сайт не в какую не хотел поддерживать русские пароли. При регистрации пользователь в качестве пароля мог использовать только цифры и латинские буквы. Но для рунета также актуальна поддержка паролей с использованием кириллицы. Преимущества в том, что такой пароль пользователь легче запоминает, а также более высокая безопасность, на тот случай если его попытаются подобрать. Например китайские хакеры)).
Задача заключалась научить PHP обрабатывать в регулярный выражениях русские символы. решение нашлось не сразу, но оказалось довольно таки простым.
Перед регулярным выражением в скрипте следует указать локаль, делается это написанием следующей команды (если используется кодировка UTF-8, если CP1251 то пишем её):
далее само регулярное выражение с ключем \u, чтобы обработчик знал, что в вырожении используются национальные символы.
Таким образом мы научили регулярные выражения дружить с кириллицей. Если есть какие-то дополнения то пожалуйста пишите.
PHP
Похожие записи
4 комментария to “PHP. Кириллица в регулярных выражениях”
Не вырезает согласно шаблону прочие символы, типа знака вопроса и т.д. Если убрать ключ \u, то вырезает, но не дружит с кириллицей…
Была похожая задача с кириллицей, только на проверку русских символов в слове без цифр, то бишь слово должно быть написано ТОЛЬКО русскими буквами.
Писать через setlocale(LC_ALL, «ru_RU.UTF-8»); порой не вариант — не каждый сервак работает с кириллицей (как и в моем случае тоже). Поэтому решил обойти другим способом через 2 функции. Может кому то понадобится — буду рад function translitArray() < $arr = array(«А» =>«A», «Б» => «B», «В» => «V», «Г» => «G», «Д» => «D»,
«Е» => «E», «Ё» => «YO», «Ж» => «ZH»,
«З» => «Z», «И» => «I», «Й» => «J», «К» => «K», «Л» => «L»,
«М» => «M», «Н» => «N», «О» => «O», «П» => «P», «Р» => «R»,
«С» => «S», «Т» => «T», «У» => «U», «Ф» => «F», «Х» => «X»,
«Ц» => «C», «Ч» => «CH», «Ш» => «SH», «Щ» => «SHH», «Ъ» => «‘»,
«Ы» => «Y», «Ь» => «», «Э» => «E», «Ю» => «YU», «Я» => «YA»,
«а» => «a», «б» => «b», «в» => «v», «г» => «g», «д» => «d»,
«е» => «e», «ё» => «yo», «ж» => «zh»,
«з» => «z», «и» => «i», «й» => «j», «к» => «k», «л» => «l»,
«м» => «m», «н» => «n», «о» => «o», «п» => «p», «р» => «r»,
«с» => «s», «т» => «t», «у» => «u», «ф» => «f», «х» => «x»,
«ц» => «c», «ч» => «ch», «ш» => «sh», «щ» => «shh», «ъ» => «»,
«ы» => «y», «ь» => «», «э» => «e», «ю» => «yu», «я» => «ya»,); return $arr;
> function checkTownName($town_name)/> $town_name = str_replace(» «, «», $town_name);
$town_length = mb_strlen($town_name);
str_replace($tArr, «», $town_name, $town_check_length);
return $town_check_length==$town_length;
> Соль в том, что кол-во замен должно равняться кол-ву символов в слове
Regular expression for validating cyrillic
Every time, when I enter a cyrillic City name (for ex: «Минск») it returns: City hame only from letters and -. Variable $_POST[‘city’] looks like: Ð�инÑ�к In JS this code works correct, I think something is in encoding.
I had similar problem with this one recently, for cities written in Serbian cyrillic (like «Београд, Москва, Каиро» ). Check encoding for both pages, one where there is POST form and this one with function.
8 Answers 8
You can use the following pattern to validate non latin characters:
See this post for the full explanation
A better solution to match Cyrillic and Common characters would be:
This looks like utf-8, if it is, this tip from cebelab on php.net might be helpful:
I noticed that in order to deal with UTF-8 texts, without having to recompile php with the PCRE UTF-8 flag enabled, you can just add the following sequence at the start of your pattern: (*UTF8)
for instance : ‘#(*UTF8)[[:alnum:]]#’ will return TRUE for ‘é’ where ‘#[[:alnum:]]#’ will return FALSE
Use the builtin special character group :alnum: for this, you will need to reverse your match:
function validate_city($field) < if ($field == "") return "Enter city.
"; else if (preg_match("/(*UTF8)^[[:alnum:]]+$/", $field)) return ""; return "City hame only from letters and -.
"; >
edit, ah, forgot utf-8 in regex ; )