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/