Регулярные выражения - что не так?

Mr_Promoter
На сайте с 06.08.2004
Offline
254
713

Задача пропустить только корректные доменные имена и субдомены то есть sub.domen.ru пропустить, а sub.домен.rю уже втопку.

делаю так

<?

$Pattern="[-0-9a-z._]+\.+[a-z]+";

if (preg_match($Pattern, $dom)){echo "$dom Ok";} else {echo "$dom Not!";}

?>

ни чего не пропускает

делаю так

<?

$Pattern="[-0-9a-z._]+\.+[a-z]+";

if (epregi($Pattern, $dom)){echo "$dom Ok";} else {echo "$dom Not!";}

?>

пропускает запрещенные символы.

Где моя ошибка?

http://webpromote.ru (http://webpromote.ru) - пописываю иногда ...
Shtogrin
На сайте с 02.11.2006
Offline
95
#1

<?

$Pattern="/^[\-0-9a-z\._]+\.+[a-z]+$/";
if (preg_match($Pattern, $dom)){echo "$dom Ok";} else {echo "$dom Not!";}
?>
www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
edogs software
На сайте с 15.12.2005
Offline
775
#2

1) epregi не существует

2) для preg функций нужно использовать ограничители (например ~) (например: ~[a-z]~

3) для регистронезависимого preg надо указывать модификатор i (например: ~[a-z]~i

4) текущий рег у Вас проверяет строку на предмет _вхождения_ в неё следующего

4а) буквы,цифры,тире,точка,подчеркивание

4б) точка

4в) буквы

(пункты а-в - это имеется ввиду что подряд идет)

Т.е. например _достаточно_ ваываs.rвав что бы выдался положительный результат, т.к. оно содержит нужный паттерн.

Возможно Вам надо использовать ^ и $ символы как символы соответственно начала или конца строки. Например ~^[a-z]$~ будет означать что между строка содержит только буквы.

P.S.: Включайте вывод ошибок, половину сразу увидите. Оба приведённых Вами кода неработоспособны в принципе.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
Mr_Promoter
На сайте с 06.08.2004
Offline
254
#3

Спасибо. Заработало. Не учел экранирование спецсимволов.

tommy-gung
На сайте с 22.11.2006
Offline
304
#4

попробуйте так


<?php
$Pattern="/^([-0-9a-z]+\.)+([a-z]{2,4})$/";
if(preg_match($Pattern, $dom)){echo $dom." Ok";} else {echo $dom." Not!";}
?>

ps: а разве символ подчеркивания ("_") разрешен?

исправил, исключает подряд идущие точки (например, www..domain.com)

Здесь не могла быть ваша реклама
Shtogrin
На сайте с 02.11.2006
Offline
95
#5

или еще посложнее

$Pattern='/^(?:[^\W_]((?:[^\W_]|-){0,61}[^\W_])?\.)+[a-zA-Z]{2,6}$/';

Zend_Filter::isHostname

Mr_Promoter
На сайте с 06.08.2004
Offline
254
#6

Продолжу тему. Пришлось немного доработать патерн

$Pattern="/^[0-9a-z]+[\-0-9a-z\._]+\.+[a-z]+$/";

а то некоторые молодчики умудряются писать .sub.domen.ru

Предвидя дальнейшие издевательства над доменным именем решил предотвратить доменные имена типа

sub.....domen.ru

Как правильно указать, что спецсимволы . - _ можно использовать только 1 раз подподряд?

$Pattern="/^[0-9a-z]+[\-{1}0-9a-z\.{1}_{1}]+\.+[a-z]+$/";

?

tommy-gung
На сайте с 22.11.2006
Offline
304
#7


$pattern="/^([0-9a-z]+(\-?)[0-9a-z]+\.)+([a-z]{2,4})$/";

также остался вопрос:

tommy-gung:
ps: а разве символ подчеркивания ("_") разрешен?
prlink
На сайте с 05.05.2006
Offline
195
#8
tommy-gung:
ps: а разве символ подчеркивания ("_") разрешен?

Вообще то, да...🚬

tommy-gung
На сайте с 22.11.2006
Offline
304
#9
prlink:
Вообще то, да...

спасибо, не знал

в общем


$pattern="/^(([0-9a-z]+[\-_]?)+[0-9a-z]+\.)+([a-z]{2,4})$/";

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий