Есть вот такая функция:
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);
Комментариев нет:
Отправить комментарий