Валидация url: filter_var vs RegEx

Начиная с версии 5.2 в php появилась новая функция, предназначенная для валидации данных – filter_var. Казалось бы «очень удобно» и «давно пора», но, к сожалению, не все фильтры работают как надо.

Разговор конкретно о фильтре FILTER_VALIDATE_URL.
Вот такой url он прекрасно пропускает:

http://sabotage
http://sabotage/page/

Дополнительный флаг FILTER_FLAG_HOST_REQUIRED, который, вроде как, должен акцентировать внимание на хосте, не работает.

Посему, для валидации (проверки url на корректность) имеет смысл продолжать использовать регулярные выражения.

Таких регулярок в сети больше чем много, примеры приводить не буду. Единственное, выложу маску для 100% проверки валидности корневого домена, которую использовал при чистке базы кеев:
(a(c|d|e|ero|f|g|i|l|m|n|o|q|r|rpa|s|sia|t|u|w|x|z)|b(a|b|d|e|f|g|h|i|iz|j|l|m|n|o|r|s|t|v|w|y|z)|c(a|at|c|d|f|g|h|i|k|l|m|n|o|om|oop|r|u|v|x|y|z)|d(e|j|k|m|o|z)|e(c|du|e|g|h|r|s|t|u)|f(i|j|k|m|o|r)|g(a|d|e|f|g|h|i|l|m|n|ov|p|q|r|s|t|u|w|y)|h(k|m|n|r|t|u)|i(d|e|l|m|n|nfo|nt|o|q|r|s|t)|j(e|m|o|obs|p)|k(e|g|h|i|m|n|p|r|w|y|z)|l(a|b|c|i|k|r|s|t|u|v|y)|m(a|c|d|e|f|g|h|il|k|l|m|n|o|obi|p|q|r|s|t|u|useum|v|w|x|y|z)|n(a|ame|c|e|et|f|g|i|l|o|p|r|u|z)|o(m|rg)|p(a|e|f|g|h|k|l|m|n|r|ro|s|t|w|y|qa)|r(e|o|s|u|w)|s(a|b|c|d|e|g|h|i|j|k|l|m|n|o|r|t|u|v|y|z)|t(c|d|el|f|g|h|j|k|l|m|n|o|p|r|ravel|t|v|w|z)|u(a|g|k|m|s|y|z)|v(a|c|e|g|i|n|u)|w(f|s)|y(e|t|u)|z(a|m|w))

Здесь все 272 tld домена (отсюда), кроме новомодных .рф и чего-то там арабского. Если постараться, маску можно ужать еще немного.

4 Коммент.

  1. Ваш регэксп не сможет правильно проверить адрес http://localhost, который вполне допустим…

  2. @webpartisan: указанная маска предназначена для поиска и выпиливания/обработки ссылок на интернет ресурсы, о чем в конце и сказано: 272 tld домена.

  3. Но http://sabotage – корректный URL, не понимаю претензий к filter_var, и флаг FILTER_FLAG_HOST_REQUIRED здесь опять же, правильно сработал. Вот у меня дома, например, хост http://do.

  4. @Тормоз, я выше как бы уже посыпал голову пеплом – filter_var не пригоден для валидации линков на интернет сайты.

Оставить комментарий

Получать новые комментарии на email. Вы можете подписаться без комментирования.