Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Возвращаясь к регулярным выражениям (http://forum.oszone.net/showthread.php?t=31108)

Cryon 02-07-2004 12:35 213310

Привет всем!

Помогите разобраться с довольно популярным выражением для проверки 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?
Назначение последних двух строк выражения понятны, но отсутствие таких символов как '![]{}|' в первой из них, тоже объяснить не могу?
Кто нибудь, может подсказать что нибудь по этим вопросам?


FADE 02-07-2004 12:52 213311

Cryon
в юрл от 0 до 255 потому что юрл может быть как ип адрес так и привязаное имя к этому ипу.

а проверка на спецсимволы потому как домен не может содержать такие имена, типа https://w[w]w.}{ruker.r() u это международный стандарт.

Cryon 02-07-2004 15:43 213312

Хм, хорошо...

Действительно с 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)", обнаружил, что ператор '|' работает в пределах всей группы...

FADE 02-07-2004 17:09 213313

у меня вопрос на каком языке представлен это "популярное выражение проверки url" ?

Код:

НО, шаблон не содержит
 '![]{}|' и пробел! Хотя те же мелкософтовские сервера всё это используют, т.е. существуют реальные примеры ссылок!

интерестно посмотреть на сервер подднрживающий подобные энчеры..

на сколько я знаю, данные перед отправкой кодируются в по 16ричной системе и затем передаются, пробел превратится в %20 и т.п. просто интересно посмотреть как может коректно обработаться в глобальной сети астро-нета ссылка вида:

думаю браузер будет демонстрировать свое чувство юмора - 404

[s]Исправлено: FADE, 17:15 2-07-2004[/s]

Cryon 02-07-2004 17:34 213314

Угу кодируются, но фишка в том, что когда человек вводит ссылку (скажем при регистрации на форуме) он будет её вводить так:
"www.xtec.es/ ~imagrans/manga.jpg"
или так:
"http://www.realist.fatal.ru/3[1].jpg"

В последнем случае скобки не приводятся к виду %XX при отправке.

FADE 02-07-2004 19:37 213315

да, действительно "http://www.vv.fatal.ru/3[1].jpg"
не достаточно защищено криптографически, но коректно ли пройдет проверка если записать так:

(?:#[^ '\"&[]<>]*)?

или так

(?:#[^ '\"&][<>]*)?


по мне так мне кажется нужно проверять не только ASCII символы в обычной кодировке, но и в десятичной и других.

пример
Код:

< &#60 < &lt %3C
П. С.,
обратную ковычку кстати тоже нужно проверять я думаю.

-----
у меня вопрос на каком языке представлен это "популярное выражение проверки url" ?

Добавлено:

а вот вам пример анчера использующий в качестве криптографической разметки обратную ковычку через протокол about: например..

Код:

about:<body%20onLoad=`alert('ok')`>
Добавлено:

или классический пример для этого форума

Код:

http://forum.oszone.net/topic.cgi?forum=<body%20onLoad=`alert('ok')`>
если б переменную forum не обозначили как только [1-n], где n=количеству форумов, то думаю пример работал так же как и в том примере что выше..


[s]Исправлено: FADE, 20:06 2-07-2004[/s]

FADE 03-07-2004 18:13 213316

а еще хорошо бы проверить верхний и нижний регистр...

например иногда <img> не работает, а <ImG> пройдет..


Время: 08:16.

Время: 08:16.
© OSzone.net 2001-