Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

preg_match некорректно обрабатывает кириллицу

Есть вот такая функция:
function validatenick ($nick, $js) { include('adodb5/adodb.inc.php'); include('config.php'); $db = ADONewConnection($db_driver); # $db->debug = true; $db->Connect($db_server, $db_user, $db_pass, $db_name); $valid = 0; // Корректный ник. $lat = ["A","B","C","E","H","I","K","M","O","P","T","X","a","c","e","i","k","o","p","x","y"]; $cyr = ["А","В","С","Е","Н","I","К","М","О","Р","Т","Х","а","с","е","і","к","о","р","х","у"]; $tnick = ""; if (!preg_match("/^[А-ЯЁIЇҐЎ]{1}[а-яёіїґў]{2,19}$/", $nick)) { if (!preg_match("/^[A-Z]{1}[a-z]{2,19}$/", $nick)) $valid = 1; // Некорректный ник. else { // Латинский ник. for ($i = 0; $i < strlen($nick); $i++) { if (!array_search($nick{$i}, $lat)) { $tnick = "NULL"; // Не имеет идентичного по написанию кириллического ника. break; } else $tnick .= $cyr[array_search($nick{$i}, $lat)]; } } } else { // Кириллический ник. for ($i = 0; $i < strlen($nick); $i++) { if (!array_search($nick{$i}, $cyr)) { $tnick = "NULL"; // Не имеет идентичного по написанию латинского ника. break; } else $tnick .= $lat[array_search($nick{$i}, $cyr)]; } } if ($valid == 0) { $rs = &$db->Execute("select * from users where nick = '".$nick."'"); if ($rs->PO_RecordCount('users', "nick = '".$nick."'") > 0) $valid = 2; // Этот ник занят. else if ($tnick != "NULL") { $rs = &$db->Execute("select * from users where nick = '".$tnick."'"); if ($rs->PO_RecordCount('users', "nick = '".$tnick."'") > 0) $valid = 3; // Зарегистрирован идентичный по написанию ник. } } if ($js == true) print($valid); else return $valid; }
Если на входе она получает ник латиницей, то всё ок. Но попытка скормить ей кириллический ник всегда приводит к возврату $valid = 1. Заподозрив, что проблема в передаваемых данных, я задал заведомо корректный кириллический ник внутри функции, но результат был тем же. Удаление из выражения всех нерусских символов и ё проблему не решило. В чём может быть загвоздка?
Кодировка страницы:
header("Content-Type: text/html; charset=UTF-8");
Кодировка файла та же. Версия PHP:
PHP 5.4.9-4ubuntu2.3 (cli) (built: Sep 4 2013 19:37:07)


Ответ

Используйте модификатор "u". preg_match("/^[А-Я]+$/u", $nick);

Комментариев нет:

Отправить комментарий