Как определить, является ли строка веб-адресом? - PullRequest
2 голосов
/ 09 февраля 2009

Как лучше всего определить, представляет ли строка веб-адрес? Мне нужно разрешить пользователю вводить веб-адрес в форму, но как мне проверить ввод? Пользователю должно быть разрешено вводить строки, например "http://www.google.com"" или "www.vg.no", но он не обязан вводить строки "http://".". Кроме того, существуют веб-страницы, например "tv2.no". «который сложнее проверить. Если я проверю, содержит ли строка "www" или "http://", у меня есть сильная подсказка, но я все еще не уверен на 100%. Могу ли я когда-либо быть уверен на 100%? Я так не думаю, но, возможно, некоторые из тонких умов здесь, в ТАК, можете просветить меня?

Ответы [ 12 ]

6 голосов
/ 09 февраля 2009

Извинения за последующее выражение, но, похоже, оно охватывает большинство (если не все) случаи:

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?(?#Username:Password)(?:\w+:\w­+@)?
(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)
(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[­a-z]{2}))(?#Port)
(?::[\d]{1,5})?(?#Directories)(?:(?:(?:/(?:[-\w~!$+|.,=]|%­[a-f\d]{2})+)+|/)+|\?|#)?
(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(­?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)
(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w­~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)
(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})+­)?(?#What not to end in)[^.!,:;?]$
3 голосов
/ 09 февраля 2009

Я бы рекомендовал вообще не проверять. Вместо этого используйте подход на основе регулярных выражений, и, если он не совпадает, вы можете мягко предупредить: «то, что вы написали, не похоже на действительный адрес. 1001 *

Определенно не следует идее пытаться подключиться к адресу. Это может открыть для вас все виды неприятных проблем с безопасностью, включая использование вашего веб-сайта для атак типа «отказ в обслуживании» на другие веб-сайты. Это может привести к неприятностям с законом.

Выполнение поиска DNS является дорогостоящим, но целесообразным, если вы считаете, что оно того стоит.

3 голосов
/ 09 февраля 2009

Обратите внимание, что следующие два также являются действительными веб-адресами. Вы хотите разрешить их?

  • localhost
  • 208.77.188.166
3 голосов
/ 09 февраля 2009

Сначала попробуйте проверить, является ли входной текст правильно сформированным URL-адресом, используя регулярные выражения. Если проверка в порядке, попробуйте поиск DNS, чтобы проверить, известен ли хост. Не забудьте специальный случай localhost или 127.0.0.1. Также позаботьтесь о хостах, указанных их IP-адресом. Если эти проверки в порядке, вы можете попробовать установить фактическое соединение.

Если эти проверки не пройдены, вы можете изменить введенный текст и проверить еще раз. Возможные модификации включают в себя:

  • prepend http://
  • prepend www.
  • append .com, .org, .net, независимо от того,
  • добавьте :8080, :8888, что угодно
  • смешайте любое из вышеперечисленных решений
  • попробуйте также добавить file:/// для локального доступа
2 голосов
/ 09 февраля 2009

Как насчет использования Регулярного выражения ?

Точные средства реализации будут зависеть от языка, который вы используете.

1 голос
/ 09 февраля 2009

Вы можете использовать функцию проверки Zend_Uri

1 голос
/ 09 февраля 2009

Можете ли вы выполнить поиск DNS из своего приложения, это обойдет любое «я не уверен, что это реальный адрес».

1 голос
/ 09 февраля 2009

Если вы не собираетесь использовать его в качестве действительного URI (т.е. вы делаете схему необязательной), тогда единственная реальная возможность - попытаться подключиться к нему через HTTP.

1 голос
/ 09 февраля 2009

Самый простой способ быть уверенным - использовать регулярное выражение, которое гарантирует, что у вас есть как минимум два компонента доменного имени. Таким образом, вы можете справиться с большинством плохих случаев. Это должно выглядеть примерно так:

/^(http:\/\/)?(\w+)(\.\w+)+$/
0 голосов
/ 09 февраля 2009

См. Regexp :: Common на CPAN, особенно R :: C :: URI и R :: C :: URI :: http . Даже если вы не можете использовать сами модули, в источнике есть регулярные выражения. Это хорошее начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...