Показать полную графическую версию : Возвращаясь к регулярным выражениям
Привет всем!
Помогите разобраться с довольно популярным выражением для проверки URL:
-----------------
~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?
* *(?:
* * * *(?:[a-z0-9-]{1,128}\.)+
* * * *(?:com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)
* * * *(?:(?!0[^.]|255)[0-9]{1,3}\.){3}
* * * *(?!0|255)[0-9]{1,3}
* * )
* * (?:/[a-z0-9.,_@%&?+=\~/-]*)?
* * (?:#[^ '\"&<>]*)?
$~i
-----------------------
Я его немного отформатировал... *Здесь все понятно, пока я не добираюсь до опережающих негативных проверок. Никак не соображу, зачем они? Причем даже их начинку толком не разберу, что за '0' и '255' в url?
Назначение последних двух строк выражения понятны, но отсутствие таких символов как '![]{}|' в первой из них, тоже объяснить не могу?
Кто нибудь, может подсказать что нибудь по этим вопросам?
Cryon
в юрл от 0 до 255 потому что юрл может быть как ип адрес так и привязаное имя к этому ипу.
а проверка на спецсимволы потому как домен не может содержать такие имена, типа https://w[w]w.}{ruker.r() u это международный стандарт.
Хм, хорошо...
Действительно с IP я стормозил, но все равно не понимаю, как это должно работать... Вот здесь мы определили домен:
(?:[a-z0-9-]{1,128}\.)+
(?:com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})
А здесь, при необходимости '|' подсавим IP вместо домена:
|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}
(?!0|255)[0-9]{1,3}
Кстати, не совсем понятно как тут использована операция |, т.е. смысл ясен - выбрать домены ИЛИ ip, но она же работает между ближайшими группами, т.е. (...)(var1)|(var2)(...), а судя по коду, тот же домен состоит из нескольких групп. Тогда получается: что в выборе участвуют только (net)|(66.79.174.172). Как же так?
Интересно, почему для IP нельзя было записать так:
(?:[0-9]{1,3}\.){3}[0-9]{1,3}
И возвращаясь к строке после домена:
(?:/[a-z0-9.,_@%&?+=\~/-]*)?
она озватывает весь остаток до якоря, НО, шаблон не содержит
'![]{}|' и пробел! Хотя те же мелкософтовские сервера всё это используют, т.е. существуют реальные примеры ссылок!
Пока!
Добавлено:
Извеняюсь по поводу "(var1)|(var2)", обнаружил, что ператор '|' работает в пределах всей группы...
у меня вопрос на каком языке представлен это "популярное выражение проверки url" ?
НО, шаблон не содержит
'![]{}|' и пробел! Хотя те же мелкософтовские сервера всё это используют, т.е. существуют реальные примеры ссылок!
интерестно посмотреть на сервер подднрживающий подобные энчеры..
на сколько я знаю, данные перед отправкой кодируются в по 16ричной системе и затем передаются, пробел превратится в %20 и т.п. просто интересно посмотреть как может коректно обработаться в глобальной сети астро-нета ссылка вида:
https:www.oszone.net/his%20robots.txt
думаю браузер будет демонстрировать свое чувство юмора - 404
Исправлено: FADE, 17:15 2-07-2004
Угу кодируются, но фишка в том, что когда человек вводит ссылку (скажем при регистрации на форуме) он будет её вводить так:
"www.xtec.es/ ~imagrans/manga.jpg"
или так:
"http://www.realist.fatal.ru/3[1].jpg"
В последнем случае скобки не приводятся к виду %XX при отправке.
да, действительно "http://www.vv.fatal.ru/3[1].jpg"
не достаточно защищено криптографически, но коректно ли пройдет проверка если записать так:
(?:#[^ '\"&[]<>]*)?
или так
(?:#[^ '\"&][<>]*)?
по мне так мне кажется нужно проверять не только ASCII символы в обычной кодировке, но и в десятичной и других.
пример
< &#60 &#x3C; &lt %3C
П. С.,
обратную ковычку кстати тоже нужно проверять я думаю.
-----
у меня вопрос на каком языке представлен это "популярное выражение проверки url" ?
Добавлено:
а вот вам пример анчера использующий в качестве криптографической разметки обратную ковычку через протокол about: например..
about:<body%20onLoad=`alert('ok')`>
Добавлено:
или классический пример для этого форума
http://forum.oszone.net/topic.cgi?forum=<body%20onLoad=`alert('ok')`>
если б переменную forum не обозначили как только [1-n], где n=количеству форумов, то думаю пример работал так же как и в том примере что выше..
Исправлено: FADE, 20:06 2-07-2004
а еще хорошо бы проверить верхний и нижний регистр...
например иногда <img> не работает, а <ImG> пройдет..
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC