Идеальный URL

Zh0rzh

Новичок
Идеальный URL

Как это глупо не звучит, но я хочу создать регулярне выражения для "идеального URL'a".
Вот кое какие наброски
PHP:
$w="[:alnum:]";
$reg_url= "((https?|ftp|gopher)://)[$w-]+(\\.[$w-]+)*\\.(ru|net|org|com|name|biz|ua|kz|tv|mil|gov)". // 1
              "(/[^ &#%/]*)*". //2
              "(\\?[^ #]*)?".//3
              "(#[^ &%]*)?".//4
            "";
1 - имя сервера. Обязательна приставки http или др. Потом как минимум имя домена второго уровня. Допускается неограниченное количество вложенных доменов, которые могут состоят только из цифр, букв и "-". Имя домена первого уровня выбирается из списка.
2 - Путь, В именах каталого и файло не допускаются символы & # % /.
3 - строка запроса. Тут может быть все что угодно, кроме символа #, который является показателем именя якоря.
4 - имя якоря.
Есть сомнения. Может нужно добавить еще какие нибудь символы в имя хоста. Запретить какие нить символы в 2-4 пунктах?
Еще в 1-ом пункте отсутствует связка логин:пароль , для авторизации.
Может у кого нибудь есть дополнеия. Предлагайте.
 

Zh0rzh

Новичок
нашел

Кому интересно

ftp://ftp.rfc-editor.org/in-notes/rfc1738.txt
ftp://ftp.rfc-editor.org/in-notes/rfc1808.txt

2AnToXa полезная вещь - RFC
 

Zh0rzh

Новичок
Автор оригинала: Demiurg
[m]parse_url[/m]
С этой же страницы
>>This function is notmeant to validate the given URL, it only breaks it up into the above listed parts. Partial urls are also accepted, parse_url()tries its best to parse them correctly.

Так что ента функция не совсем подходит для проверки урла
 

Zh0rzh

Новичок
Проанализирую выше приведенные RFC, и в скорости выдам результат
 

Demiurg

Guest
>Так что ента функция не совсем подходит для проверки урла
после разбивки просто смотришь, что есть а чего нет. Если нет необходимой части, значит урл - похой.
 

Demiurg

Guest
>совсем не факт, там в комментах есть пример, когда урл не валидный, а домен есть

естественно, но проверять можно не только на наличие, но и валидность.
 

AnToXa

prodigy-одаренный ребенок
а валидность кто буддет проверять? :)
parse_url ? :)

о чем с самого начала говорилось помнишь?
 

Zh0rzh

Новичок
Вот она выражение, полученное в результате анализа вышеприведенных RFC.
PHP:
$w="[:alnum:]";
$a="[:alpha:]";
$d="[:digit:]";
$s= "\\$\\_\\.\\+-";
$ex="!\\*'\\(\\),";
$hx="[:digit:]ABCDEFabcdef";
$ur="$ex$w$s";
$user="(([\\?&=;$ur]|%[$hx]{2})+)";
$pass=$user;
$hs=";:@&=$ur";
$rs=";/\\?:@&=";
$reg_url= "((https?|ftp)://)($user(:$pass)?@)?([$w-]+(\\.[$w-]+)*\\.([1-250]|ru|net|org|com|name|biz|ua|kz|tv|mil|gov|localdomain))".
           "(/?(([$hs]|%[$hx])+/?)*)".
              "(\\?[$hs]*)?".
              "(#[$rs$ur]*)?".
            "";
Если использовать данное регуляное выражение в контексте функции eregi, то части урла распределятся по массиву, имя которого передано третьим параметром, сделующим образом.

scheme - 1
login - 4
pass - 7
host - 9
topdomain - 11
path - 12
file - 13
query_stribg - 15
flag - 16

Если заметите какие нибудь погрешности и выскажете их, то буду благодарен.
 

Zh0rzh

Новичок
Собственно не плохо быо бы еще реализовать на Perl-совместимых регулярных выражениях.
Мысля на будущее :)
 

aloner

Guest
> |ru|net|org|com|name|biz|ua|kz|tv|mil|gov|localdomain

А как же .biz/.firm/.info/.by/.kz etc..?
 

Zh0rzh

Новичок
Автор оригинала: Zh0rzh

PHP:
$w="[:alnum:]";
$a="[:alpha:]";
$d="[:digit:]";
$s= "\\$\\_\\.\\+-";
$ex="!\\*'\\(\\),";
$hx="[:digit:]ABCDEFabcdef";
$ur="$ex$w$s";
$user="(([\\?&=;$ur]|%[$hx]{2})+)";
$pass=$user;
$hs=";:@&=$ur";
$rs=";/\\?:@&=";
$reg_url= "((https?|ftp)://)($user(:$pass)?@)?([$w-]+(\\.[$w-]+)*\\.([1-250]|ru|net|org|com|name|biz|ua|kz|tv|mil|gov|localdomain|firm|info|by))".
           "(/?(([$hs]|%[$hx])+/?)*)".
              "(\\?[$hs]*)?".
              "(#[$rs$ur]*)?".
            "";
 

aloner

Guest
P.S.

Я бы на твоем месте переделал регексп в PCRE-формат и избавился от POSIXов.
ereg_*() - зло.
 

Zh0rzh

Новичок
ого мать их ... всяких Уганд и не предусмотришь :))
тогда правим так
PHP:
$reg_url="((https?|ftp)://)($user(:$pass)?@)?([$w-]+(\.[$w-]+)*\.([1-250]|[[:alpha:]]{2,10}))".
.......


Я бы на твоем месте переделал регексп в PCRE-формат и избавился от POSIXов.
ereg_*() - зло.
Эта идея у меня промелькала в голове
 

Flying

Guest
а схемы корме http(s) и ftp типа не существуют? :)

да и много других вещей этот regexp не учитывает. номер порта, правильность пути, query string, fragment, возможные ошибки в имени домена и т.п.
 
Сверху