Простое регулярное выражение, а не работает как надо

grey109

Новичок
Простое регулярное выражение, а не работает как надо

Регулярное выражение для проверки корректности логина при регистрации на сайте:


if (!eregi("^[a-z]{1}[a-z0-9\-\._]{2,8}[a-z0-9]{1}$", $login, $t)) echo "error";
else echo "ok";

Данное регулярное выражение проходит проверку при $login = "test-", хотя не должно, т.к. логин должен начинаться с буквы, содержать буквы/цифры/символы "-._", заканчиваться цифрой/буквой и не должен быть более 10 символов.


Где ошибка?
 

DiMA

php.spb.ru
Команда форума
забудь о иреге как о страшном сне

if (!preg_match("!^[a-z]{1}[a-z0-9\-\._]{2,8}[a-z0-9]{1}$!is", $login, $t)

для кругозора:

минус и точку внутри [ ] не слешат
минус нужно поставить перед ]

{1} - бессмысленная конструкция, просто удали ее, ничего не изменится

$t - не используешь, удали
 

LONGMAN

Dark Side of the Moon..
У меня есть такой код
PHP:
if(preg_match('#\S*(\.ge|\.com|\.net|\.ru|\.mobi|\.org|\.ua)\S*#isU',$msg)) send_to_admin($msg);
Мне нужно переписать регулярку так, что бы он логировал только те сообшения в котором после етих доменов идёт ^a-z0-9 то есть всё кроме букв и цифр. Я переписал его так
PHP:
preg_match('#\S+(\.ge|\.com|\.net|\.ru|\.mobi|\.org|\.ua)*([^a-z0-9])#isU',$msg)
Но не сработал как я хотел. Что в этом регулярке не так?
 

zerkms

TDD infected
Команда форума
для кругозора:

минус и точку внутри [ ] не слешат
не всегда. - не слешат только тогда, когда pcre однозначно может его трактовать как литеру, а не символ диапазона.
 

DiMA

php.spb.ru
Команда форума
> не всегда

не понимаю

Внутри [] слешить вообще ничего не нужно, т.е. без слешей можно обойтись. Всегда. С любыми символами, вклчая сами скобки [], метасимволы, квантификаторы, ^, $ и т.д.

Исключение - ограничитель самого рега. Но его нужно выбрать, чтобы не попадался. Поэтому я юзаю "!", а не "/". Решетка тоже подойдет.
 

zerkms

TDD infected
Команда форума
DiMA
я к тому, что если не экранировать - то нельзя располагать литеру "-" в произвольном месте
например [a-z] и [a\-z] это разные наборы символов
 

DiMA

php.spb.ru
Команда форума
В произвольном - нельзя. Нужно знать, где ставить минус и все остальные сиволы.

А слешить все подряд, по моему скромному мнению, дурной тон. Например, для рега \n или \\n или \\\n - один хрен (выбираем самый короткий вариант). А вот \x00-\x1F или \\\x00-\\\x1F - уже не будет работать (тока с двумя слешами).
 

zerkms

TDD infected
Команда форума
Да это понятно, я просто сделал ремарку. А то очередной начинающий может тебя трактовать слишком вольно:
минус и точку внутри [ ] не слешат
:)
 

DiMA

php.spb.ru
Команда форума
если тебе не ответили - значит плохо спросил
попробуй свои силы в новом топике
 

LONGMAN

Dark Side of the Moon..
DiMA
Топик думаю подходящий.. Просто не хотел создавать новую тему ради этой мелочи
 
Сверху