Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > регулярное выражение для проверки доменного имени


Автор: fridy 14.1.2006, 17:09
Вот придумал регулярное выражение для проверки правильности формата доменного имени.
Код

m/^\w+-*\w*\.\w+[\.]?\w*[\.]?\w*$/

Хочу узнать мнение сведущих в регулярках людей.
Насколько это надёжный вариант, всё ли я учел?

Автор: korob2001 14.1.2006, 18:16
Попробуй применить свой шаблон к такому URL:
http://www.yandex.ru

Автор: Guest 14.1.2006, 22:03
Блин, забыл совсем!

Вот, поправил
Код

m/^(http:\/\/)?(\w\w\w)?(\/)?\w+-*\w*\.\w+[\.]?\w*[\.]?\w*$/


Теперь всё на месте?

Автор: fridy 14.1.2006, 22:07
Прошу прощения, забыл назваться, я сегодня с отключенными куками!

Автор: korob2001 15.1.2006, 11:40
Ну а как же другие протоколы https, ftp и т.д ?
Попробуй такой вариант:
Код

#!/usr/bin/perl -w
use strict;
my @urls = ( 'http://yandex.ru/catalog/lib/cat.html',
             'www.yahoo.com/search/results/search.php',
             'ftp://filmz.tr.tk/home/toolz/film.avi',
             'http://www.sharereactor.ru/games-catamog/gm.htm',
             '10.0.0.1/jhgdfjhsd/dfuwnbvxc',
             'http://10.0.0.50/jhsdgf/sdfiwe',
             'yahoo.com/jsdgfs/sdfhgsd',
             'https://www.securitylab.net',
             'http://antonium.org/cgi-bin/antonium/guest.pl?mess=1&xs=c5df26a2e5f' );

# Собственно тебя интересует следующая строка.
s/^(.+\..+?)\/(?:.+)?/$1/ for @urls;

print join("\n", @urls);

Автор: fridy 15.1.2006, 15:16
Это немного не то. Мне это нужно для проверки урлов которые вводятся в форме гостевой.
Поэтому обязательный прямой слеш не нужен и к тому же мне кажется этот шаблон слишком общий.
Я имею ввиду вот это - .+
Такой шаблон допускает и пробелы и строчки типа www.yahoocom тоже проходят.
Добавлено @ 15:19
Я знаю что проверку строки лучше делать перед отправкой формы
на стороне клиента. Это на случай если JavaScript отключен.

Автор: korob2001 16.1.2006, 11:54
Хех, ну так ты так и говори, что тебе нужно проверить URL. Я просто думал тебе нужно получить доменное имя из URL.
Тогда попробуй такой код:
Код

#!/usr/bin/perl -w
use strict;
my($protoPattern, $urlWithOutProto) = ();

# Здесь получаешь URL, для прстоты я просто присвоил его статически
my $url = "http://www.securitylab.subdomain.ru/cgi-bin/home.php?sx=a45f52de2f21&s=457812452124";

# В следующей строке укажи через | все допустимые протоколы
$protoPattern = qr/^(?:http|ftp|https):\/\//i;

# Вырезаем из URL протокол и сохраняем изменения в во временной переменной $urlWithOutProto
( $urlWithOutProto = $url ) =~ s/$protoPattern//o;

# Проверяем адрес
if ( $urlWithOutProto =~ /^(?:(?:w{3}\.)?(?:[a-z0-9_-]*?\.){1,2}[a-z]{2,4}(?:\/[a-z0-9_-]*?)*?(?:\.[a-z~]{1,5})?\??(?:[a-z_-]+?=[a-z0-9_\%-]+?)*?(?:\&[a-z]=[a-z0-9_\%-]*)*?)?$/i ) {
     print "URL прошёл проверку\n";
     # Здесь сохраняем $url в базу или файл
} else {
     print "URL завалился на проверке\n";
     # выдаём сообщение об ошибке
}

Данная проверка пропустит такие URL как:

http://www.securitylab.ru/home.php
http://www.securitylab.ru
www.securitylab.ru
securitylab.ru
securitylab.subdomain.ru
www.securitylab.subdomain.ru
http://www.securitylab.subdomain.ru/cgi-bin/home.php?sx=a45f52de2f21&s=457812452124

Ну и разумеется можно так же добавить в шаблон и чего-нить своего, если чего-то на твой взгляд в нём не хватает. Вобщем попробуй с различными адресами. Возникнут сложности, пиши.

Автор: Sadok 17.1.2006, 11:38
Код

(?:[^:/?#]+:)?(?://[^/?#]*)?[^?#]*(?:\?[^#]*)?(?:#.*)?


Выдрано из URI::Split

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)