![]() |
Привет всем!
Помогите разобраться с довольно популярным выражением для проверки 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 и т.п. просто интересно посмотреть как может коректно обработаться в глобальной сети астро-нета ссылка вида: думаю браузер будет демонстрировать свое чувство юмора - 404 [s]Исправлено: FADE, 17:15 2-07-2004[/s] |
Угу кодируются, но фишка в том, что когда человек вводит ссылку (скажем при регистрации на форуме) он будет её вводить так:
"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')`> [s]Исправлено: FADE, 20:06 2-07-2004[/s] |
а еще хорошо бы проверить верхний и нижний регистр...
например иногда <img> не работает, а <ImG> пройдет.. |
Время: 08:16. |
Время: 08:16.
© OSzone.net 2001-