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