Регулярка и кодировка

Bars

Новичок
Посылаю на скрипт русский логин "Андрей", но он не проходит первый preg_match, в котором разрешены символы а-яА-Я. В лог пишет "Андрей1", при успехе должно быть "Андрей2"
PHP:
    if (!preg_match("/^[a-zA-Zа-яА-Я0-9_-]+$/", $login) || !preg_match("/^[a-zA-Z0-9_-]+$/", $postPass) || !preg_match("/^[a-zA-Z0-9_-]+$/", $action)) {
        $logger->WriteLine($login.'1');
        exit(Security::encrypt("errorLogin<$>", $key1));
    } else {
        $logger->WriteLine($login.'2');
    }
Что тут может быть? Кодировка скрипта UTF-8 без BOM
 

Kotofey

FloodMaster.
Посылаю на скрипт русский логин "Андрей", но он не проходит первый preg_match, в котором разрешены символы а-яА-Я. В лог пишет "Андрей1", при успехе должно быть "Андрей2"
PHP:
    if (!preg_match("/^[a-zA-Zа-яА-Я0-9_-]+$/", $login) || !preg_match("/^[a-zA-Z0-9_-]+$/", $postPass) || !preg_match("/^[a-zA-Z0-9_-]+$/", $action)) {
        $logger->WriteLine($login.'1');
        exit(Security::encrypt("errorLogin<$>", $key1));
    } else {
        $logger->WriteLine($login.'2');
    }
Что тут может быть? Кодировка скрипта UTF-8 без BOM
попробуйте использовать параметр регулярки "u" , к примеру "!preg_match("/^[a-zA-Zа-яА-Я0-9_-]+$/u...."
 
  • Like
Реакции: Bars

hell0w0rd

Продвинутый новичок
PHP:
var_dump(preg_match("/^[a-zA-Zа-яА-Я0-9_-]+$/u", 'Лёша')); // int(0)
Помимо ё вроде еще что-то есть.
 

AnrDaemon

Продвинутый новичок
Я не просто так дал ссылку. Это всё можно сделать. И даже больше.
Причём меньшими усилиями и без дурацких ошибок, типа пропущеной буквы "ё".
 

Bars

Новичок
Появился ещё один вопрос по теме, поэтому новую не создаю: теперь я редактирую скрипт регистрации и мне нужно чтобы нельзя было чередовать русские символы с английскими. В таком виде это не работает:
PHP:
if( preg_match( "/[\||\'|\<|\>|\[|\]|\"|\!|\?|\$|\@|\/|\\\|\&\~\*\{\+]/", $name ) || !preg_match('#^[A-Za-z0-9_]+$#i', $name) || !preg_match('#^[А-Яа-я0-9_]+$#i', $name) )
Оригинал:
PHP:
if( preg_match( "/[\||\'|\<|\>|\[|\]|\"|\!|\?|\$|\@|\/|\\\|\&\~\*\{\+]/", $name ) || !preg_match('#^[A-Za-z0-9_]+$#i', $name) )
 

AnrDaemon

Продвинутый новичок
Простите, на что-на что переходите? PHP 5.3 не поддерживается.
А по вашему вопросу я приводил ссылку выше. А в комментариях там же ещё одна ссылка, с более развёрнутым объяснением.
http://www.regular-expressions.info/unicode.html
 

Bars

Новичок
А, просто у меня самого подпись не видна. ОНА БЫЛА СТАРАЯ!
Ну и тем не менее, если б она была актуальной, то согласитесь, 5.2 не поддерживается и подавно...
 

Bars

Новичок
А по вашему вопросу я приводил ссылку выше. А в комментариях там же ещё одна ссылка, с более развёрнутым объяснением.
http://www.regular-expressions.info/unicode.html
Здесь нету как сделать ЛИБО только русские, ЛИБО только английские, и уж тем более комментариев к статье.
 

Bars

Новичок
Появился ещё один вопрос по теме, поэтому новую не создаю: теперь я редактирую скрипт регистрации и мне нужно чтобы нельзя было чередовать русские символы с английскими. В таком виде это не работает:
PHP:
if( preg_match( "/[\||\'|\<|\>|\[|\]|\"|\!|\?|\$|\@|\/|\\\|\&\~\*\{\+]/", $name ) || !preg_match('#^[A-Za-z0-9_]+$#i', $name) || !preg_match('#^[А-Яа-я0-9_]+$#i', $name) )
А должно. Он находит только английские символы => первая регулярка проходит, он находит только русские символы => вторая регулярка проходит, он находит и русские, и английские символы - все || не проходят. Всё верно же
 

AnrDaemon

Продвинутый новичок
Ну нелья быть таким тугим.
PHP:
<?php

$patt = array(
  'enmix' => '/^[\p{Latin}0-9_-]+$/u',
  'rumix' => '/^[\p{Cyrillic}0-9_-]+$/u',
  'combined' => '/^[\p{Latin}0-9_-]+$|^[\p{Cyrillic}0-9_-]+$/u',
);

$data = array(
'cyr' => "АБВабв",
'eng' => "ABCabc",
'sym' => "-_",
'num' => "0123456789",
'mix' => "AАBБCВ",
);

foreach($data as $name => $value)
{
  printf('%s: %s ', $name, $value);
  foreach($patt as $test => $pattern)
  {
    printf('%s:%s ', $test, preg_match($pattern, $value) ? 'pass' : 'fail');
  }
  print "\n";
}
 

Absinthe

жожо
AnrDaemon,


не самый хороший пример регулярки. Дубрилование - всегда плохо.

Проверять условия в регулярках лучше через (?=).
 

AnrDaemon

Продвинутый новичок
Я не проверяю условия, я проверяю соответствие строки одному из двух наборов символов.
Приведи свой пример, может, я чего-то не понял из твоего намёка?

P.S.
Картинка конечно зачётная, но как ещё достучаться до человека, которого с ложечки кормишь, а он нос воротит?
 
Сверху