2009-07-17 3 views
23

Я использую следующее регулярное выражение, чтобы соответствовать URL:Regex чтобы соответствовать 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.

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

Благодарю вас за внимание.

ответ

19
$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:// объявлены.

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

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

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

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

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

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

в

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

(есть ? за дополнительную плату), чтобы соответствовать 'URL' без схемы.

+1

, но я не хочу, чтобы http: // в начале был обязательным. так как я хочу, чтобы он соответствовал «abc.com». –

+0

кажется, что мы прокомментировали/отредактировали синхронно. Исправлена. – Boldewyn

+0

вы можете улучшить [\ S] *, вероятно, без пробелов + только слова + только цифры или что-то еще, что разрешено в URL-адресе? –

1

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

1

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

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

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

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

12

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

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

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

+0

Значит, это не соответствует части запроса и запроса URL-адреса? – lulalala

+0

Также не удается сопоставить дефисы в URL-адресе. – Styphon

+1

Вам нужно избегать слэшей в 'https?: //', но все же оно слишком велико. Вы можете проверить его здесь: http://www.regexr.com/ – ahmd0

-2

(http|www)\S+

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

+1

Как насчет ftp? – Flexo

+9

Это очень плохое регулярное выражение. Я не могу поверить, что люди голосовали за это. Это плохо, потому что он также будет соответствовать полностью недействительному 'httpcheese' как действительный URL-адрес. –

-2

Просто, чтобы добавить к вещам. Я знаю, что это не полностью и напрямую отвечает на этот конкретный вопрос, но это лучшее место, которое я могу найти, чтобы добавить эту информацию. Я написал подключаемый модуль 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); 

jsFiddle с примером:

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

0

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 
+0

Что означает «/?» означает около конца регулярного выражения? Ты имел ввиду "\/?" – barrycarter

+0

Кажется, что не работает для таких вещей, как «http://s3.amazonaws.com/plivocloud/4c743546-7e1b-11e2-9060-002590662312.mp3» – barrycarter

0

Это ТОТ:

_^(?:(?: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 
6

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

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

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

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

Объяснение:

  • Похож на .com и т.д.
  • Совпадает все перед ним до места
  • Матчей всех после него до места
0

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

3

Это позволит получить любой URL в полном объеме, в том числе = и # /, если они существуют:

/[A-Za-z]+:\/\/[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_:%&;\?\#\/.=]+/g 
-1
[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'); 
+1

вы можете лучше отформатировать свой ответ? Это очень сложно понять. – Felix

Смежные вопросы