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

Доброе время суток.

Хочется сказать,что очень полезный ресурс и хорошая публика. Спасибо администрации за проэкт.

А теперь просьба. У меня всегда были непонятки в написании регулярных выражений. Искал в инете,но там другие варианты,не то что мне надо. А пытаясь из них что-то изобрести это просто не работает. Я обязательно поплню знаниями о регулярных выражениях,но сейчас очень срочно надо.

Необходимо написать регулярное выражение для проверки URL адреса. Но с условием: проверять надо маску domain.prefix , например business.com без всяких http:// и www. Просто строка вида site.com ,но при этом если будут субдомены чтобы он понимал ,что они там есть и должны быть.

Итогово: сайт qwe.rty-uio.com и zxcvbn.com проходят на проверку,а asdfg нет,потому что на конце нет префикса. Думаю понятно выразил просьбу :) Спасибо всем,кто ответит!

1 ответов



/(([a-z0-9\-\.]+)?[a-z0-9\-]+(!?\.[a-z]{2,4}))/
 
в качестве проверки смотри http://rubular.com/regexes/12916
регулярка работает со строками типа:
qwe.rty-uio.com
zxcvbn.com
google.ru
124qwe.ru
qazzz.ru
qwe.ertyy
ss.ss.qwerty.ru

Я еще свои 5 копеек добавлю. Вот здесь — http://www.ietf.org/rfc/rfc2396.txt — находится стандарт (немного устаревший), описывающий валидный URI. Листайте до приложения А. (A. Collected BNF for URI), там находится составное регулярное выражение для любого возможного URI. Ну то есть, чтобы его применить, нужно перевести на тот язык регулярок, которым вы пользуетесь. А вот тут — http://labs.apache.org/webarch/uri/rfc/rfc3986.html#regexp — находится регулярка для препарации валидного урла на составные части (собственно, там же можно найти стандарт новее, но мне там описание регулярками не понравилось, менее понятно). Кому лень, вот она:


 ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 
Возможно, она поможет вам составить правильную валидирующую регулярку )

Ну и чтобы меня занудой не посчитали, вот моя попытка:

^([a-zA-Z0-9]+[\-\.]?)+[a-zA-Z0-9]+\.$
 
Это до того извращения с доменами и портами, предложенное товарищем Asmodeus. То есть дальше нужно вставить его концовку, если устраивает ) Если нужно выдирать только валидный урл из любой строки, то символы ^ и $ следует убрать, это, надеюсь, понятно =)

ask-dev.
3dev-ask2-ru.
as-k.de-v.
ask2.d3v.ru-plus.

— проходят проверку.


А, чего уж там, давайте разберем, что, собственно, происходит и почему все именно так. Не забываем, что мы говорим только о hostname без http://

1. Имя должно начинаться с буквы или цифры:

[a-zA-Z0-9]
 
Почему здесь не подходит \w? Потому что эта группа состоит не только из букв и цифр, а еще и из символа подчеркивания, а он в hostname запрещен (по крайней мере, мне не удалось зарегистрировать домен с символом подчеркивания в нем; несколько дефисов подряд тоже нельзя, тоже не регистрируют =).

2. Далее имя может продолжаться группой букв и/или цифр и может заканчиваться символом дефиса или точки:

[a-zA-Z0-9]+[\-\.]?
 
+ дает нам один или несколько символов из группы [a-zA-Z0-9], ? дает один или ни одного символа из группы [\-\.]. Таким образом, на данный момент подходят строки: «45jh.», «f-», «jd7».

3. Конструкций, описанных в пункте 2, может быть одна или несколько:

([a-zA-Z0-9]+[\-\.]?)+
 
Это решается заключением группы в скобки и добавлением квантификатора +.

4. Доменному имени первого уровня должна предшествовать группа букв и/или цифр, оканчивающаяся одной точкой:

[a-zA-Z0-9]+\.
 
Тут все просто.

А теперь объединяем все это в одну строку и получаем регулярку, приведенную выше. Надеюсь, не нужно объяснять, что делать, если хочется охватить еще и кириллические символы в URL =)

чтож. дубль два
доработан благодаря советам + то, о чем все забыли упомянуть -присутствие порта (:80 или :8080 или :10000)
==========================================================================


(((\w+\-*.)+)?(\w+\-*)+\.{1}(?:рф|com|aero|biz|com|coop|edu|eu|gov|info|int|mil|museum|name|net|org|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)(?::\d+)?)
 
===========================================================================
если в конце этого чуда поставить $ - будет отлавливаться только строка вида домен.ру, если нет, то из строки вида домен.ру.труляля будет извлечено "домен.ру". кстати если кодировка UTF-8 то адреса вида кремль.рф будет найдено. вот на чем пробовал:

вот.домен.рф
qwe.rty--uio.com
zxcvbn.com
google.ru
124qwe.ru
qazzz.r <-не сработает
qwe.ertyy <-найдет qwe.er
ss.ss.qwerty.ru:80
.rty.ru.ru
123.qwer.ru
-rty.ru
.rty.ru
qw-qwe.ru
ali.com.ru:899
uz.com.ru
uz.com.ru.qqqq

З.Ы. кто найдет "слабость" или ошибку - сообщайте. буду дико признателен

Вот тут большая коллекция готовых Regexp выражений на все случаи жизни: http://regexlib.com/Default.aspx
(сайт на английском)


================
http://blog.dvteam.ru