Регулярное выражение для соответствия URL - PullRequest
23 голосов
/ 17 июля 2009

Я использую следующее регулярное выражение для сопоставления URL:

$search  = "/([\S]+\.(MUSEUM|TRAVEL|AERO|ARPA|ASIA|COOP|INFO|NAME|BIZ|CAT|COM|INT|JOBS|NET|ORG|PRO|TEL|AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|au|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|EH|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|R|H|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|YU|ZA|ZM|ZW)([\S]*))/i";

Но он немного облажался, потому что он также соответствует "abc.php", который я не хочу. и что-то вроде abc ... test. Я хочу, чтобы он совпадал с abc.com. и www.abc.com, а также http://abc.com.

Просто нужно немного подправить в конце, но я не уверен, что. (должна быть косая черта после любого доменного имени, которое оно сейчас не проверяет и только проверяет \ S)

спасибо за ваше время.

Ответы [ 14 ]

19 голосов
/ 17 июля 2009
$search  = "#^((?#
    the scheme:
  )(?:https?://)(?#
    second level domains and beyond:
  )(?:[\S]+\.)+((?#
    top level domains:
  )MUSEUM|TRAVEL|AERO|ARPA|ASIA|EDU|GOV|MIL|MOBI|(?#
  )COOP|INFO|NAME|BIZ|CAT|COM|INT|JOBS|NET|ORG|PRO|TEL|(?#
  )A[CDEFGILMNOQRSTUWXZ]|B[ABDEFGHIJLMNORSTVWYZ]|(?#
  )C[ACDFGHIKLMNORUVXYZ]|D[EJKMOZ]|(?#
  )E[CEGHRSTU]|F[IJKMOR]|G[ABDEFGHILMNPQRSTUWY]|(?#
  )H[KMNRTU]|I[DELMNOQRST]|J[EMOP]|(?#
  )K[EGHIMNPRWYZ]|L[ABCIKRSTUVY]|M[ACDEFGHKLMNOPQRSTUVWXYZ]|(?#
  )N[ACEFGILOPRUZ]|OM|P[AEFGHKLMNRSTWY]|QA|R[EOSUW]|(?#
  )S[ABCDEGHIJKLMNORTUVYZ]|T[CDFGHJKLMNOPRTVWZ]|(?#
  )U[AGKMSYZ]|V[ACEGINU]|W[FS]|Y[ETU]|Z[AMW])(?#
    the path, can be there or not:
  )(/[a-z0-9\._/~%\-\+&\#\?!=\(\)@]*)?)$#i";

Просто немного почистил. Это будет соответствовать только адресам HTTP (s), и, если вы правильно скопировали все домены верхнего уровня из IANA, только те, которые стандартизированы (это будет не соответствовать http://localhost) и с заявленным http://.

Наконец, вы должны завершить часть пути, которая всегда будет начинаться с /, если она там есть.

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

Приветствия

Кстати: Ваше регулярное выражение также будет соответствовать something.r и something.h (между | TO | и | TR | в вашем примере). Я оставил их в своей версии, так как, думаю, это была опечатка.

При перечитывании вопроса: Изменение

  )(?:https?://)(?#

до

  )(?:https?://)?(?#

(дополнительно ?) для сопоставления URL-адресов без схемы.

12 голосов
/ 18 августа 2010

Не совсем то, что запрашивал OP, но это гораздо более простое регулярное выражение, которое не нужно обновлять каждый раз, когда IANA вводит новый TLD. Я считаю, что это более подходит для самых простых нужд:

^(?:https?://)?(?:[\w]+\.)(?:\.?[\w]{2,})+$

нет списка TLD, localhost не совпадает, количество частей должно быть> = 2, а длина каждой части должна быть> = 2 (fx: «aa» не будет соответствовать, но «a.ab» будет соответствовать ).

6 голосов
/ 19 июля 2013

На этот вопрос было удивительно трудно найти ответ. Регулярные выражения, которые я нашел, были слишком сложны для понимания, и все, что регулярное выражение является слишком сложным и слишком сложным для реализации.

Наконец-то придумали:

/(\S+\.(com|net|org|edu|gov)(\/\S+)?)/

Работает с http://example.com, https://example.com, example.com, http://example.com/foo.

Пояснение:

  • Ищет .com и т. Д.
  • Сопоставляет все до того, как это до места
  • Совпадает со всем после него до пробела
5 голосов
/ 29 июля 2015

Это получит любой URL в полном объеме, включая? = И # /, если они существуют:

/[A-Za-z]+:\/\/[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_:%&;\?\#\/.=]+/g
1 голос
/ 05 ноября 2013

Я думаю, что это просто и эффективно /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

1 голос
/ 17 июля 2009

Изменение конца регулярного выражения на (/\S*)?)$ должно решить вашу проблему.

Чтобы объяснить, что это делает -

  • он ищет /, за которым следуют некоторые символы (без пробелов)
  • это совпадение необязательно, ? указано 0 или 1 раз
  • и, наконец, за ним должен следовать конец строки (или изменить его на \b для сопоставления на границе слова).
1 голос
/ 17 июля 2009

Использование одного регулярного выражения для сопоставления строки URL делает код невероятно нечитаемым. Я бы предложил использовать parse_url , чтобы разбить URL на его компоненты (что не является тривиальной задачей), и проверить каждую часть с помощью регулярного выражения.

0 голосов
/ 25 апреля 2017
[ftp:\/\/www\/.-https:\/\/-http:\/\/][a-zA-Z0-9u00a1-uffff0]{1,3}[^ ]{1,1000} 

Это прекрасно работает для меня в JS

var regex = new RegExp('[ftp:\/\/www\/.-https:\/\/-http:\/\/][a-zA-Z0-9u00a1-uffff0]{1,3}[^ ]{1,1000}');
regex.exec('https://www.youtube.com/watch?v=FM7MFYoylVs&feature=youtu.be&t=20s');
0 голосов
/ 14 марта 2015

Попробуйте Regexy :: Web :: Url

r = Regexy::Web::Url.new # matches 'http://foo.com', 'www.foo.com' and 'foo.com'

0 голосов
/ 31 мая 2013

Это ОДИН:

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...