ошибка при работе с регулярными выражениями
{
if(empty($value)) {echo " не заполнено поле $field <br>";}
else
{
if (preg_match("/[^0-9a-z_-]/i",$value)) {echo "ошибка соответствия $field<br>";}
else {echo "поле $field соответствует формату <br>";};
}
}
Слово "first" вчера удовлетворяло условиям шаблона, то есть код выводил сообщение "поле соотвествует формату". При проверке слова "first" сейчас срабатывает второй вариант, то есть "first" не удовлетворяет условию шаблона. Не могу понять, что за магия?
Все верно.
$pattern = '/[^0-9a-z_-]/i';
$regExp = preg_match($pattern,$subject);
var_dump($regExp);
[QUOTE=php manual]
К примеру, символьный класс [aeiou] соответствует любой гласной букве в нижнем регистре, в то время, как [^aeiou] соответствует любому символу, не являющемуся гласной буквой нижнего регистра.
[/QUOTE]
Регулярные выражения в деталях
этот код означает,что в переменной $value не должно быть никаих символов, кроме перечисленных: 0-9a-zA-Z_-, причем "i" указывает что регистр букв неважен?!
alekciy, а как же этот код в первом случае пропускает(шаблон) слово "first", а во втором нет? (слово "first" приведено для примера) Например, на слово "login" не имеет не удовлетворяющих шаблону символов, то есть срабатывает {echo "поле $field соответствует формату <br>";};
этот код означает,что в переменной $value не должно быть никаих символов, кроме перечисленных: 0-9a-zA-Z_-, причем "i" указывает что регистр букв неважен?!
alekciy, а как же этот код в первом случае пропускает(шаблон) слово "first", а во втором нет? (слово "first" приведено для примера) Например, на слово "login" не имеет не удовлетворяющих шаблону символов, то есть срабатывает {echo "поле $field соответствует формату <br>";};
Крышка ^ стоящая в начале означает отрицание. Приведенный вами пример выражения говорит о том, что в переменной могут быть любые символы КРОМЕ перечисленных.
alekciy, а как же этот код в первом случае пропускает(шаблон) слово "first", а во втором нет? (слово "first" приведено для примера)
В каком первом? В каком втором? Я не вижу другой сопроводительный код, поэтому не берусь судить, но есть подозрение, что в одном случае работаем с юникодом, в другом нет. Или же используем квалификаторы жадности.
А вообще, прежде чем пытаться что-то писать, в частости код, то стоит удосужить себя великим трудом чтения документации. Ссылку я привел чуть выше. Я конечно понимаю, что букавак там очень много, но если приходится писать регулярные выражения, то синтаксис знать не просто нужно, его знать обязательно.
Крайне рекомендую прочесть "Регулярные выражения, Часть I" и "Регулярные выражения, Часть II". Автор очень доходчиво разъяснил суть регулярок буквально на пальцах. Вкупе с с маном дает очень сильное понимание этой области.
и все стало на свои места
alekciy и ребята, спасибо!
preg_match("/^[0-9a-zA-ZА-Яа-я]{3,20}$/",$value)
Но после того, как в шаблоне убрал метасимволы начала "^"и конца "$" строки, русский алфавит стал восприниматься нормально
preg_match("/[0-9a-zA-ZА-Яа-я]{3,20}/",$value)
могу ошибаться, но имхо, в этом и была проблема.
кажется, можно было сделать примерно так
Бывает. Ты уверен, что не пытаешься работать с юникодом и приэтом не выставляешь флаг u? Что в конце строки у тебя нет знаков переноса строки или перевода корректки? От того, что их не видно, вовсе не следует, что их там нет.
Во избежании подобных проблем лучше не использовать ^ и $ одновременно. Используй только знак начала строки.
А я сейчас говорю в целом, а не конкретно в контексте первого поста.
не, просто ради интереса... и я не думаю, что используется textarea :) (для слова от 3х до 20 символов)
Вот то-то и оно... не думаю, используется (потому сам бы не использовал), а может и используется... а в юникоде или не_юникоде символы?... а... много может быть разных причин, какая там действительно ситуация не знает даже автор ;) .
Поэтому я и формулирую общие рекоментации на основании которых вполне реально дальше разобраться. Было бы желание.
Пишу в PHP Expert Editor, в настройках файл->кодировка->ANSI; есть еще опция "формат конца строки" из трех вариантов(windows,unix,mac) выбрано windows. На страничке с формой, с которой введенные данные идут на проверку соответствия шаблону, кодировка задана <meta http-equiv='Content-Type' content='text/html;charset=windows-1251' > :confused: На ночь глядя, проблема кажется неразрешимой(
А в чем проблема то?
Но после того, как в шаблоне убрал метасимволы начала "^"и конца "$" строки, русский алфавит стал восприниматься нормально
preg_match("/[0-9a-zA-ZА-Яа-я]{3,20}/",$value)
Юзай вариант
preg_match("/^[0-9a-zA-ZА-Яа-я]{3,20}/",$value)