Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибка при работе с регулярными выражениями

8.8K
05 октября 2008 года
opex
71 / / 17.01.2007
Код:
foreach($_POST as $field=>$value)
  {
    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" не удовлетворяет условию шаблона. Не могу понять, что за магия?
12
05 октября 2008 года
alekciy
3.0K / / 13.12.2005
Все дело в волшебных пузырьках ;)
Цитата: opex
При проверке слова "first" сейчас срабатывает второй вариант, то есть "first" не удовлетворяет условию шаблона.


Все верно.

 
Код:
$subject = 'first';
$pattern = '/[^0-9a-z_-]/i';
$regExp = preg_match($pattern,$subject);
var_dump($regExp);

[QUOTE=php manual]
К примеру, символьный класс [aeiou] соответствует любой гласной букве в нижнем регистре, в то время, как [^aeiou] соответствует любому символу, не являющемуся гласной буквой нижнего регистра.
[/QUOTE]
Регулярные выражения в деталях
366
06 октября 2008 года
int
668 / / 30.03.2005
У тебя щас должен проходить русский алфавит, прописные буквы и всякие там спецсимволы с пробелами, так что правильно делает что не удовлетворяет
8.8K
06 октября 2008 года
opex
71 / / 17.01.2007
я чего-то не понимаю,да?
 
Код:
preg_match("/[^0-9a-zA-Z_-]/i",$value)


этот код означает,что в переменной $value не должно быть никаих символов, кроме перечисленных: 0-9a-zA-Z_-, причем "i" указывает что регистр букв неважен?!

alekciy, а как же этот код в первом случае пропускает(шаблон) слово "first", а во втором нет? (слово "first" приведено для примера) Например, на слово "login" не имеет не удовлетворяющих шаблону символов, то есть срабатывает {echo "поле $field соответствует формату <br>";};
13
06 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
Цитата: opex
я чего-то не понимаю,да?
 
Код:
preg_match("/[^0-9a-zA-Z_-]/i",$value)


этот код означает,что в переменной $value не должно быть никаих символов, кроме перечисленных: 0-9a-zA-Z_-, причем "i" указывает что регистр букв неважен?!

alekciy, а как же этот код в первом случае пропускает(шаблон) слово "first", а во втором нет? (слово "first" приведено для примера) Например, на слово "login" не имеет не удовлетворяющих шаблону символов, то есть срабатывает {echo "поле $field соответствует формату <br>";};



Крышка ^ стоящая в начале означает отрицание. Приведенный вами пример выражения говорит о том, что в переменной могут быть любые символы КРОМЕ перечисленных.

353
06 октября 2008 года
Nixus
840 / / 04.01.2007
Приведеный шаблон проверяет есть ли в строке хоть один символ не входящий в "0-9a-zA-Z_-".
12
06 октября 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: opex
я чего-то не понимаю,да?
alekciy, а как же этот код в первом случае пропускает(шаблон) слово "first", а во втором нет? (слово "first" приведено для примера)


В каком первом? В каком втором? Я не вижу другой сопроводительный код, поэтому не берусь судить, но есть подозрение, что в одном случае работаем с юникодом, в другом нет. Или же используем квалификаторы жадности.

А вообще, прежде чем пытаться что-то писать, в частости код, то стоит удосужить себя великим трудом чтения документации. Ссылку я привел чуть выше. Я конечно понимаю, что букавак там очень много, но если приходится писать регулярные выражения, то синтаксис знать не просто нужно, его знать обязательно.

Крайне рекомендую прочесть "Регулярные выражения, Часть I" и "Регулярные выражения, Часть II". Автор очень доходчиво разъяснил суть регулярок буквально на пальцах. Вкупе с с маном дает очень сильное понимание этой области.

8.8K
07 октября 2008 года
opex
71 / / 17.01.2007
После внимательного прочтения Регулярные выражения, Часть I, изменил шаблон на
 
Код:
preg_match("/^[0-9a-zA-ZА-Яа-я]{3,20}$/",$value)

и все стало на свои места
alekciy и ребята, спасибо!
8.8K
10 октября 2008 года
opex
71 / / 17.01.2007
И все-таки данный шаблон неправильно работал с русским алфавитом.

 
Код:
Шаблон, который некорректно работает с русским алфавитом:
preg_match("/^[0-9a-zA-ZА-Яа-я]{3,20}$/",$value)


Но после того, как в шаблоне убрал метасимволы начала "^"и конца "$" строки, русский алфавит стал восприниматься нормально

 
Код:
Правильная работа с русскми алфавитом:
preg_match("/[0-9a-zA-ZА-Яа-я]{3,20}/",$value)
92
10 октября 2008 года
Тень Пса
2.2K / / 19.10.2006
все симовлы от 0 до 9, от a до z, от A до Z и тд... ставишь кол-во от 3х до 20, и следом говоришь, что у тебя может быть СКОЛЬКО УГОДНО таких вот символов))))

могу ошибаться, но имхо, в этом и была проблема.

кажется, можно было сделать примерно так

 
Код:
/^(\d|\w){3,20}$/i
что такое \d и \w - в мануале есть...
12
10 октября 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: opex
И все-таки данный шаблон неправильно работал с русским алфавитом.


Бывает. Ты уверен, что не пытаешься работать с юникодом и приэтом не выставляешь флаг u? Что в конце строки у тебя нет знаков переноса строки или перевода корректки? От того, что их не видно, вовсе не следует, что их там нет.
Во избежании подобных проблем лучше не использовать ^ и $ одновременно. Используй только знак начала строки.

92
10 октября 2008 года
Тень Пса
2.2K / / 19.10.2006
alekciy, ну как может быть перенос строки введён пользователем в input? не, просто ради интереса... и я не думаю, что используется textarea :) (для слова от 3х до 20 символов)
12
10 октября 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: Тень Пса
alekciy, ну как может быть перенос строки введён пользователем в input?


А я сейчас говорю в целом, а не конкретно в контексте первого поста.

Цитата: Тень Пса

не, просто ради интереса... и я не думаю, что используется textarea :) (для слова от 3х до 20 символов)


Вот то-то и оно... не думаю, используется (потому сам бы не использовал), а может и используется... а в юникоде или не_юникоде символы?... а... много может быть разных причин, какая там действительно ситуация не знает даже автор ;) .

Поэтому я и формулирую общие рекоментации на основании которых вполне реально дальше разобраться. Было бы желание.

8.8K
10 октября 2008 года
opex
71 / / 17.01.2007
Ничего из предложенного мной и другими не работает правильно ни с русским, ни с английским алфавитом Окончательно запутан
Пишу в PHP Expert Editor, в настройках файл->кодировка->ANSI; есть еще опция "формат конца строки" из трех вариантов(windows,unix,mac) выбрано windows. На страничке с формой, с которой введенные данные идут на проверку соответствия шаблону, кодировка задана <meta http-equiv='Content-Type' content='text/html;charset=windows-1251' > :confused: На ночь глядя, проблема кажется неразрешимой(
12
11 октября 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: opex
Ничего из предложенного мной и другими не работает правильно ни с русским, ни с английским алфавитом Окончательно запутан


А в чем проблема то?

Цитата: opex

Но после того, как в шаблоне убрал метасимволы начала "^"и конца "$" строки, русский алфавит стал восприниматься нормально

 
Код:
Правильная работа с русскми алфавитом:
preg_match("/[0-9a-zA-ZА-Яа-я]{3,20}/",$value)


Юзай вариант

 
Код:
Правильная работа с русскми алфавитом:
preg_match("/^[0-9a-zA-ZА-Яа-я]{3,20}/",$value)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог