регулярное выражение

Kirill

Новичок
регулярное выражение

Не подскажете как написать функцию которая бы проверяла логин при регистрации,
разрешенными симовлами являются a-z, 0-9 знак подчеркивания _ и тире,
запрещенными - все остальные. Пишу так(часть кода)
if(ereg("[0-9a-z_-]+", $string)){
return true;
}
else{
return false;
}
- не отфилтровываются знаки препинания и проч., т.е. если строчка будет
что-то типа test,.. то вернет тру, а мне надо чтоб в таких случаях фолз возвращала, как правильно написать регулярное выражение,
чтобы прокатывали тока разрешенные символы?
 

Кром

Новичок
Ты сначала почитай про функцию, которую ты используешь. :)
Во-первых ты не понял, в каких случаях она возвращает твое true, а во-вторых, лучше использовать [m]preg_match[/m].
 

sakon

П..и.н..ок
Kirill
Если я не ошибаюсь - тебе надо, что то вроде этого:
if(preg_match("/^[0-9a-z_-]+$/si", $string))
 

Kirill

Новичок
дак а как мне рег. выражение правильно написать?

-~{}~ 16.02.05 23:14:

sakon видимо мы сообщения одновременно писали :)

-~{}~ 16.02.05 23:16:

ты не мог бы объяснить что значит: $/si ?
 

sakon

П..и.н..ок
vladax
угу. точно забыл. :) Надеюсь в мане он найдет ответ насчет якорей.
 

Gigahard

Guest
Дабы не создавать новую тему, опишу ситуацию здесь.

Понадобилась мне проверка правильности телефонного номера...

Так как писать такой обработчик с помощью строковых функций влом, решил попробовать все же эти регулярные выражения.

Ну первым делом я конечно залез на этот форум :). Нашел только одну похожую тему, где человеку с таким же как и у меня вопросом, посоветовали заплатить за енто выражение бабульки.

Поняв что мне ничего не светит, пошел читать мануал к PHP.

Посли трех часов мучений, внезапно пришло озарение :). Regexp'ы POSIX'а стали понятны как белый день.
В результате появился на свет вот такой обработчик проверки телефона:

PHP:
^(((\+)?[0-9]{1,2})?[ \-]?\([0-9]{1,3}\))?[ \-]?[0-9]{3}[ \-]?[0-9]{2}[ \-]?[0-9]{2}[ \-]?$
А рабочий пример выглядит так:

PHP:
<? 
// [[[+]XX](XXX)]XXXXXXX
$phone="+7(095)5555555";
$phone=trim($phone);
$phone= chop($phone);
if(ereg("^(((\+)?[0-9]{1,2})?[ \-]?\([0-9]{1,3}\))?[ \-]?[0-9]{3}[ \-]?[0-9]{2}[ \-]?[0-9]{2}[ \-]?$", $phone))
{print $phone . " is a correct phone number";}
else
{print "Wrong number (".$phone.")";}
?>
Собственно теперь вопрос и просьба.

Ну вопрос конечно - правильно ли все? У меня покрайней мере проблем с работой выражения не возникло.
Ну и просьба. Если можно потестить сие творение :).

P.S. Конечно понимаю, что будете бить за POSIX, но на изучение PCRE не было времени... Всетаки первый опыт работами с регулярными выражениями в PHP...

------------------------------EDITED---------------------------------

Kirill
PHP:
"[0-9a-z_-]+"
Вроде правильно, за исключением двух вещей:

1. Насколько я понял, для корректной работы регулярных выражений, требуется наличие знаков ^(маркер начала строки) и $(маркер конца строки). Т.е. твое выражение должно выглядеть так:
PHP:
"^[0-9a-z_-]+$"
2. Поскольку символ "-" является управляющим внутри конструкции [...], то его все же следует писать вместе с отменяющим символом: "\-". Тогда окончательный вид твоего выражения будет такой:
PHP:
"^[0-9a-z_\-]+$"
После исправлений, все работает как нужно.

Можно расширить это выражение, добавив буквы верхнего регистра:
PHP:
"^[0-9a-zA-Z_\-]+$"
 

sakon

П..и.н..ок
Gigahard
Специально для такого умного как ты:
http://phpclub.ru/talk/showthread.php?postid=435853#post435853

>символ "-" является управляющим внутри конструкции [...]

метасимвол "-" означает символьный интервал.


>Конечно понимаю, что будете бить за POSIX, но на изучение PCRE не было времени

а берешся учить.......


>Если можно потестить сие творение

Wrong number (+7(944641111111111)333333333333333333343318)
 

Gigahard

Guest
sakon

Не очень понятно, к чему язвительные ответы...

метасимвол "-" означает символьный интервал.
Т.е. является управляющим. В примерах на PHP.NET используется именно "\-".

а берешся учить.......
А что, то что я сказал неправильно?


>Если можно потестить сие творение

Wrong number (+7(944641111111111)333333333333333333343318)
Ну и? Что то не нравится?
 

sakon

П..и.н..ок
Автор оригинала: Gigahard
Ну и? Что то не нравится?
Ну если не понял поробую более понятно объяснить

Wrong number (+00(944641111111111)33ddd3333333333kl;;p'oliolhukj333333343318)

Или попробуй ввести вот это +00(944641111111111)3<iframe></iframe>333333343318
 

Gigahard

Guest
Автор оригинала: sakon
Ну если не понял поробую более понятно объяснить

Wrong number (+00(944641111111111)33ddd3333333333kl;;p'oliolhukj333333343318)

Или попробуй ввести вот это +00(944641111111111)3<iframe></iframe>333333343318
И чего????

Скрипт черным по белому отвечает:

WRONG NUMBER (пер. англ. "Неправильный номер").

Или ты хочешь сказать, что это корректные телефонные номера :)?
 

sakon

П..и.н..ок
Либо я плохо понимаю, либл ты не понимаешь
Wrong number (+7 (8534) 833335) - это тоже корректный номер.
 

Gigahard

Guest
Автор оригинала: sakon
Либо я плохо понимаю, либл ты не понимаешь
Wrong number (+7 (8534) 833335) - это тоже корректный номер.
В коментарии дан шаблон проверки номера.
Проверяются семизначные номера + трехзначный код города + код страны.


А каким образом, ты можешь называть телефонным номером такую запись:

+00(944641111111111)33ddd3333333333kl;;p'oliolhukj333333343318

или такую:

+00(944641111111111)3<iframe></iframe>333333343318

мне не понятно...

Чтобы исключить дальнейшие недоразумения, хочу пояснить, что проверяются телефоны Москвы, Питера, и федеральные номера сотовых операторов. +телефоны некоторых крупных городов мира.
 

sakon

П..и.н..ок
М-дя..... тада вопросов нет.

>проверяются телефоны Москвы, Питера, и федеральные номера сотовых операторов. +телефоны некоторых крупных городов мира

Это супер.........
[off]
Рад за г. Екатеринбург, который попал под твою маску и обидно за г.Чебоксары.
[/off]
 
Сверху