Страницы

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

вторник, 31 декабря 2019 г.

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

#php #регулярные_выражения #кодировка #utf_8


Есть вот такая функция:

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) 

    


Ответы

Ответ 1



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

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

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