Regex соответствует URL-адресу

Я использую следующее регулярное выражение для соответствия 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)

Благодарю вас за ваше время.

Ответ 1

$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 (-ов), и, пока вы правильно копируете все домены верхнего уровня из IANA, только стандартизированные (они не будут соответствовать http://localhost) и объявлены http://.

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

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

Приветствия,

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

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

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

к

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

(есть ? extra), чтобы сопоставить "URL" без схемы.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Пояснение:

  • Ищет .com и т.д.
  • Совпадает со всем, что есть до него.
  • Совпадает со всем после него до места

Ответ 4

Это получит весь URL-адрес целиком, включая? = И #/, если они существуют:

/[A-Za-z]+:\/\/[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_:%&;\?\#\/.=]+/g

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

$: доллар означает конец строки.
Например, \d * $будет соответствовать строкам, заканчивающимся цифрой. Поэтому вам нужно добавить $!

Ответ 8

Regex для соответствия всем URL-адресам (с www, без www, с http или https, без http или https, включает все доменные имена верхнего уровня 2-6 букв [для стран, ex 'ly', 'us'], порты, строки запроса и привязки ['#']). Это не 100%, но лучше, чем что-либо, что я видел в Интернете.

Он использует домены верхнего уровня из первого ответа в сочетании с другими методами, найденными в моих поисках. Он вернет любой действительный url, который имеет границы, то есть где \b вступает в игру. Поскольку конечный '/' также запускается с помощью \b, последний, является совпадением для одного или нескольких '?'.

/\b((http(s?):\/\/)?([a-z0-9\-]+\.)+(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])(:[0-9]{1,5})?((\/([a-z0-9_\-\.~]*)*)?((\/)?\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)/gi

Ответ 9

Это ОДИН:

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected])?(?:(?!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

Ответ 10

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

Ответ 11

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

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

Ответ 12

[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');

Ответ 13

(http|www)\S+

Просто используйте это регулярное выражение для соответствия всем URL

Ответ 14

Просто чтобы добавить к вещам. Я знаю, что это не полностью и напрямую отвечает на этот конкретный вопрос, но это лучшее место, которое я могу найти, чтобы добавить эту информацию. Я написал подключаемый модуль jQuery некоторое время назад, чтобы сопоставлять URL-адреса для аналогичной цели, однако в текущем состоянии (будет обновляться с течением времени) он все равно рассмотрит адреса, такие как "http://abc.php", как действительные. Однако, если нет http, https или ftp при запуске url, он не вернет "valid". Хотя я должен уточнить, этот метод jQuery возвращает объект, а не одну строку или логическое значение. Объект разрушает вещи, а среди пробоя -.valid логическое. См. Полную скрипку и тест в ссылке внизу. Если вы просто хотите захватить плагин и идти, см. Ниже:

Плагин jQuery

(function($){$.matchUrl||$.extend({matchUrl:function(c){var b=void 0,d="url,,scheme,,authority,path,,query,,fragment".split(","),e=/^(([^\:\/\?\#]+)\:)?(\/\/([^\/\?\#]*))?([^\?\#]*)(\?([^\#]*))?(\#(.*))?/,a={url:void 0,scheme:void 0,authority:void 0,path:void 0,query:void 0,fragment:void 0,valid:!1};"string"===typeof c&&""!=c&&(b=c.match(e));if("object"===typeof b)for(x in b)d[x]&&""!=d[x]&&(a[d[x]]=b[x]);a.scheme&&a.authority&&(a.valid=!0);return a}});})(jQuery);

jsВстроить пример:

http://jsfiddle.net/SpYk3/e4Ank/