Как написать регулярное выражение для URL без схемы? - PullRequest
1 голос
/ 09 июня 2009

Как я могу написать RE, который проверяет URL-адреса без схемы:

Pass:

  • www.example.com
  • example.com

Сбой:

Ответы [ 5 ]

4 голосов
/ 09 июня 2009
^[A-Za-z0-9][A-Za-z0-9.-]+(:\d+)?(/.*)?$
  • строка должна начинаться с буквы ASCII или цифры
  • Следуют буквы ASCII, цифры, точки и тире (косая черта или двоеточие не допускаются)
  • необязательно: разрешен порт (":8080")
  • необязательно: после косой черты может следовать что угодно (так как вы сказали "URL")
  • затем конец строки

Мысли:

  • переводы строк не допускаются
  • нет проверки действительности или здравомыслия
  • нет поддержки "интернационализированных доменных имен" (IDN)
  • если хотите, не указывайте части "option:", но обязательно указывайте окончательный "$"

Если ваш регулярный выражение поддерживает это, вы можете сократить это до:

^[A-Za-z\d][\w.-]+(:\d+)?(/.*)?$

Имейте в виду, что \w может включать символы Unicode в некоторые разновидности регулярных выражений. Кроме того, \w включает подчеркивание, которое недопустимо в именах хостов. Такой явный подход, как первый, был бы более безопасным.

1 голос
/ 09 июня 2009

Если вы пытаетесь сделать это для какого-то реального кода, найдите библиотеку разбора URL для вашего языка и используйте ее. Если вы не хотите его использовать, загляните внутрь, чтобы увидеть, что он делает.

То, что вы называете "ресурсом", называется "схемой". Это задокументировано в RFC 1738 , в котором говорится:

[2.1] ... Обычно URL-адреса записываются следующим образом:

   <scheme>:<scheme-specific-part>

URL содержит название используемой схемы (), за которой следует двоеточием, а затем строкой (<схема-специфическая-часть>), чья Интерпретация зависит от схемы.

А позже в БНФ

схема = 1 * [lowalpha | цифра | "+" | "-" | "" ]

Итак, если есть схема, вы можете сопоставить ее с:

/^[a-z0-9+.-]+:/i

Если это соответствует, у вас есть то, что синтаксис URL рассматривает как схему, и ваша проверка не пройдена. Если у вас есть строки с номерами портов, например, www.example.com:80, то все становится не так. На практике я не имел дело со схемами с - или ., поэтому вы можете добавить помадку реального мира, чтобы обойти это, пока не решите использовать подходящую библиотеку.

Все, кроме этого, например, проверка существующих и доступных доменов и т. Д., Лучше оставить библиотеке, которая уже все поняла.

0 голосов
/ 09 июня 2009

Спасибо, ребята, я думаю, что у меня есть Python и PHP решение. Вот они:

Python Solution:

import re

url = 'http://www.foo.com'
p = re.compile(r'^(?!http(s)?://$)[A-Za-z][A-Za-z0-9.-]+(:\d+)?(/.*)?$')
m = p.search(url)
print m     # m returns _sre.SRE_Match if url is valid, otherwise None 

PHP Решение:

$url = 'http://www.foo.com';
preg_match('/^(?!http(s)?:\/\/$)[A-Za-z][A-Za-z0-9\.\-]+(:\d+)?(\/\.*)?$/', $url);
0 голосов
/ 09 июня 2009

Синтаксис URL довольно сложный , его нужно немного сузить. Вы можете сопоставить что угодно .ext, если этого достаточно:

^[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}$
0 голосов
/ 09 июня 2009

Я думаю,

/^[\p{Alnum}-]+(\.[\p{Alnum}-]+)+$/

В более примитивном синтаксисе RE это будет

/^[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)+$/

Или еще более примитивно:

/^[0-9A-Za-z-][0-9A-Za-z-]*\.[0-9A-Za-z-][0-9A-Za-z-]*(\.[0-9A-Za-z-][0-9A-Za-z-]*)*$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...