Какое лучшее регулярное выражение проверяет правильность строки?

Как проверить, является ли данная строка действительным URL-адресом?

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

Я только что написал сообщение в блоге для отличного решения для распознавания URL-адресов в большинстве используемых форматов, таких как:

Используемое регулярное выражение:

 /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/ 

Однако я бы порекомендовал вам перейти на http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without-, чтобы увидеть рабочий пример.

Какая платформа? Если вы используете .NET, используйте System.Uri.TryCreate , а не регулярное выражение.

Например:

 static bool IsValidUrl(string urlString) { Uri uri; return Uri.TryCreate(urlString, UriKind.Absolute, out uri) && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps || uri.Scheme == Uri.UriSchemeFtp || uri.Scheme == Uri.UriSchemeMailto /*...*/); } // In test fixture... [Test] void IsValidUrl_Test() { Assert.True(IsValidUrl("http://www.example.com")); Assert.False(IsValidUrl("javascript:alert('xss')")); Assert.False(IsValidUrl("")); Assert.False(IsValidUrl(null)); } 

(Спасибо @Yoshi за отзыв о javascript: 🙂

Вот что использует RegexBuddy .

 (\b(https?|ftp|file)://)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|] 

Он соответствует этим ниже (внутри знаков ** ** ):

 **http://www.regexbuddy.com** **http://www.regexbuddy.com/** **http://www.regexbuddy.com/index.html** **http://www.regexbuddy.com/index.html?source=library** 

Вы можете скачать RegexBuddy по адресу http://www.regexbuddy.com/download.html .

Что касается ответа на вопрос о глазу , который гласит: «Это основано на моем чтении спецификации URI».: Спасибо, Eyelidness, ваше идеальное решение, которое я искал, поскольку он основан на спецификации URI! Превосходная работа. 🙂

Я должен был внести две поправки. Первое, чтобы регулярное выражение правильно совпадало с IP-адресами в PHP (v5.2.10) с помощью функции preg_match ().

Мне пришлось добавить еще один набор круглых скобок к строке над «IP-адресом» вокруг труб:

 )|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?# 

Не знаю, почему.

Я также уменьшил минимальную длину домена верхнего уровня от 3 до 2 букв для поддержки .co.uk и тому подобного.

Итоговый код:

 /^(https?|ftp):\/\/(?# protocol )(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?# username )(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?# password )@)?(?# auth requires @ )((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?# domain segments AND )[az][a-z0-9-]*[a-z0-9](?# top level domain OR )|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?# )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?# IP address ))(:\d+)?(?# port ))(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*(?# path )(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)(?# query string )?)?)?(?# path and query string optional )(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?(?# fragment )$/i 

Эта модифицированная версия не была проверена на соответствие спецификации URI, поэтому я не могу ручаться за ее соответствие, она была изменена для обработки URL-адресов в локальных сетевых средах и двухзначных TLD, а также других видов веб-URL и лучшей работы в PHP настройка я использую.

Как PHP- код:

 define('URL_FORMAT', '/^(https?):\/\/'. // protocol '(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'. // username '(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'. // password '@)?(?#'. // auth requires @ ')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'. // domain segments AND '[az][a-z0-9-]*[a-z0-9]'. // top level domain OR '|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'. '(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'. // IP address ')(:\d+)?'. // port ')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path '(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'. // query string '?)?)?'. // path and query string optional '(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'. // fragment '$/i'); 

Вот тестовая программа на PHP, которая проверяет множество URL-адресов с помощью регулярного выражения:

  

Еще раз спасибо за вечность для регулярного выражения!

У Mathias Bynens есть отличная статья о лучшем сравнении множества регулярных выражений: в поисках идеального регулярного URL-адреса проверки URL-адресов

Самый лучший опубликованный – немного длинный, но он соответствует практически всему, что вы можете бросить на него.

Версия для JavaScript

 /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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]))|(?:(?:[az\u00a1-\uffff0-9]-*)*[az\u00a1-\uffff0-9]+)(?:\.(?:[az\u00a1-\uffff0-9]-*)*[az\u00a1-\uffff0-9]+)*(?:\.(?:[az\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i 

PHP-версия

 _^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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]))|(?:(?:[az\x{00a1}-\x{ffff}0-9]-*)*[az\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[az\x{00a1}-\x{ffff}0-9]-*)*[az\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[az\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$_iuS 

Сообщение « Получение частей URL (регулярное выражение)» обсуждает parsing URL-адреса для идентификации его различных компонентов. Если вы хотите проверить, правильно ли сформирован URL-адрес, его должно быть достаточно для ваших нужд.

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

В общем, тем не менее, вам, вероятно, будет лучше использовать функцию, предоставленную вам вашей инфраструктурой или другой библиотекой. Многие платформы include функции, которые анализируют URL-адреса. Например, есть модуль urlparse Python, а в .NET вы можете использовать конструктор classа System.Uri в качестве средства проверки URL-адреса.

Это может быть не работа для регулярных выражений, а для существующих инструментов на выбранном вами языке. Вероятно, вы захотите использовать существующий код, который уже был написан, протестирован и отлажен.

В PHP используйте функцию parse_url .

Perl: модуль URI .

Ruby: URI модуль .

.NET: class «Uri»

Regexes – это не волшебная палочка, которую вы волнуете при каждой проблеме, которая связана со строками.

Неверяющий URI-reference Parser

Для справки, вот спецификация IETF: ( TXT | HTML ). В частности, Приложение B. Анализ URI-ссылки с регулярным выражением демонстрирует, как анализировать действительное регулярное выражение . Это описано как,

на примере недействительного анализатора URI-ссылок, который будет принимать любую заданную строку и извлекать компоненты URI.

Вот регулярное выражение, которое они предоставляют:

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 

Как сказал кто-то другой, лучше всего оставить это в lib / framework, который вы уже используете.

Это будет соответствовать всем URL-адресам

  • с или без http / https
  • с или без www

… включая субдомены и те новые расширения доменных имен верхнего уровня, как. музей,. академии,. фундамент и т. д., который может содержать до 63 символов (не только com , net , info и т. д.),

 (([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)? 

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

как javascript

 var urlreg=/(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/; $('textarea').on('input',function(){ var url = $(this).val(); $(this).toggleClass('invalid', urlreg.test(url) == false) }); $('textarea').trigger('input'); 
 textarea{color:green;} .invalid{color:red;} 
      

Лучшим регулярным выражением для URL для меня было бы:

 "(([\w]+:)?//)?(([\d\w]|%[a-fA-F\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?" 
  function validateURL(textval) { var urlregex = new RegExp( "^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$"); return urlregex.test(textval); } 

Матчи http://site.com/dir/file.php?var=moo | FTP: // пользователь: [email protected]: 21 / файл / реж

Non-Matches site.com | http://site.com/dir//

 function validateURL(textval) { var urlregex = new RegExp( "^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$"); return urlregex.test(textval); } - function validateURL(textval) { var urlregex = new RegExp( "^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$"); return urlregex.test(textval); } 

Матчи http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as

Если вы действительно ищете окончательный матч, вы, вероятно, найдете его в « Хорошем Url Regular Expression? ».

Но регулярное выражение, которое действительно соответствует всем возможным доменам и позволяет все, что разрешено в соответствии с RFC, ужасно длинное и нечитаемое, доверяйте мне 😉

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

  • URL совпадения без протокола (www.gooogle.com)
  • Сопоставьте URL-адреса с параметрами и путем запроса ( http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e )
  • Не сопоставляйте URL-адреса, где недопустимые символы (например, «Е»), например: (www.google.com/somthing”/somethingmore)

Здесь, что я придумал, любое предложение приветствуется:

 @Test public void testWebsiteUrl(){ String regularExpression = "((http|ftp|https):\\/\\/)?[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?"; assertTrue("www.google.com".matches(regularExpression)); assertTrue("www.google.co.uk".matches(regularExpression)); assertTrue("http://www.google.com".matches(regularExpression)); assertTrue("http://www.google.co.uk".matches(regularExpression)); assertTrue("https://www.google.com".matches(regularExpression)); assertTrue("https://www.google.co.uk".matches(regularExpression)); assertTrue("google.com".matches(regularExpression)); assertTrue("google.co.uk".matches(regularExpression)); assertTrue("google.mu".matches(regularExpression)); assertTrue("mes.intnet.mu".matches(regularExpression)); assertTrue("cse.uom.ac.mu".matches(regularExpression)); assertTrue("http://www.google.com/path".matches(regularExpression)); assertTrue("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e".matches(regularExpression)); assertTrue("http://www.google.com/?queryparam=123".matches(regularExpression)); assertTrue("http://www.google.com/path?queryparam=123".matches(regularExpression)); assertFalse("www..dr.google".matches(regularExpression)); assertFalse("www:google.com".matches(regularExpression)); assertFalse("https://[email protected]".matches(regularExpression)); assertFalse("https://www.google.com\"".matches(regularExpression)); assertFalse("https://www.google.com'".matches(regularExpression)); assertFalse("http://www.google.com/path'".matches(regularExpression)); assertFalse("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e'".matches(regularExpression)); assertFalse("http://www.google.com/?queryparam=123'".matches(regularExpression)); assertFalse("http://www.google.com/path?queryparam=12'3".matches(regularExpression)); } 

я написал небольшую версию, которую вы можете запустить

он соответствует следующим URL-адресам (что достаточно для меня)

 public static void main(args){ String url = "go to http://www.m.abut.ly/abc its awesome" url = url.replaceAll(/https?:\/\/w{0,3}\w*?\.(\w*?\.)?\w{2,3}\S*|www\.(\w*?\.)?\w*?\.\w{2,3}\S*|(\w*?\.)?\w*?\.\w{2,3}[\/\?]\S*/ , { it -> "woof${it}woof" }) println url } 

http://google.com

http://google.com/help.php

http://google.com/help.php?a=5

http://www.google.com

http://www.google.com/help.php

http://www.google.com?a=5

google.com?a=5

google.com/help.php

google.com/help.php?a=5

http://www.m.google.com/help.php?a=5 (и все его перестановки)

http://www.m.google.com/help.php?a=5 (и все его перестановки)

m.google.com/help.php?a=5 (и все его перестановки)

Важная вещь для любых URL-адресов, которые не начинаются с http или www, заключается в том, что они должны включать / или?

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

найти что-нибудь, что начинается с http: https?: // w {0,3} \ w *?. \ w {2,3} \ S *

найти что-нибудь, что начинается с www: www. \ w *?. \ w {2,3} \ S *

или найти что-нибудь, что должно иметь текст, а затем точку, по крайней мере, 2 буквы, а затем? или /: \ w *?. \ w {2,3} [/ \?] \ S *

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

 ((https?:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)? 

Для поддержки обоих:

 http://stackoverflow.com https://stackoverflow.com 

А также:

 //stackoverflow.com 

Я работаю над подробной статьей, посвященной проверке URI с использованием регулярных выражений. Он основан на RFC3986.

Регуляция регулярного выражения URI

Хотя статья еще не завершена, я придумал функцию PHP, которая делает довольно хорошую работу по проверке URL-адресов HTTP и FTP. Вот текущая версия:

 // function url_valid($url) { Rev:20110423_2000 // // Return associative array of valid URI components, or FALSE if $url is not // RFC-3986 compliant. If the passed URL begins with: "www." or "ftp.", then // "http://" or "ftp://" is prepended and the corrected full-url is stored in // the return array with a key name "url". This value should be used by the caller. // // Return value: FALSE if $url is not valid, otherwise array of URI components: // eg // Given: "http://www.jmrware.com:80/articles?height=10&width=75#fragone" // Array( // [scheme] => http // [authority] => www.jmrware.com:80 // [userinfo] => // [host] => www.jmrware.com // [IP_literal] => // [IPV6address] => // [ls32] => // [IPvFuture] => // [IPv4address] => // [regname] => www.jmrware.com // [port] => 80 // [path_abempty] => /articles // [query] => height=10&width=75 // [fragment] => fragone // [url] => http://www.jmrware.com:80/articles?height=10&width=75#fragone // ) function url_valid($url) { if (strpos($url, 'www.') === 0) $url = 'http://'. $url; if (strpos($url, 'ftp.') === 0) $url = 'ftp://'. $url; if (!preg_match('/# Valid absolute URI having a non-empty, valid DNS host. ^ (?P[A-Za-z][A-Za-z0-9+\-.]*):\/\/ (?P (?:(?P(?:[A-Za-z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)? (?P (?P \[ (?: (?P (?: (?:[0-9A-Fa-f]{1,4}:){6} | ::(?:[0-9A-Fa-f]{1,4}:){5} | (?: [0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4} | (?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3} | (?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2} | (?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?:: [0-9A-Fa-f]{1,4}: | (?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?:: ) (?P[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4} | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3} (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) ) | (?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?:: [0-9A-Fa-f]{1,4} | (?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?:: ) | (?P[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&\'()*+,;=:]+) ) \] ) | (?P(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3} (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)) | (?P(?:[A-Za-z0-9\-._~!$&\'()*+,;=]|%[0-9A-Fa-f]{2})+) ) (?::(?P[0-9]*))? ) (?P(?:\/(?:[A-Za-z0-9\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*) (?:\?(?P (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))? (?:\#(?P (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))? $ /mx', $url, $m)) return FALSE; switch ($m['scheme']) { case 'https': case 'http': if ($m['userinfo']) return FALSE; // HTTP scheme does not allow userinfo. break; case 'ftps': case 'ftp': break; default: return FALSE; // Unrecognized URI scheme. Default to FALSE. } // Validate host name conforms to DNS "dot-separated-parts". if ($m['regname']) { // If host regname specified, check for DNS conformance. if (!preg_match('/# HTTP DNS host name. ^ # Anchor to beginning of string. (?!.{256}) # Overall host length is less than 256 chars. (?: # Group dot separated host part alternatives. [A-Za-z0-9]\. # Either a single alphanum followed by dot | # or... part has more than one char (63 chars max). [A-Za-z0-9] # Part first char is alphanum (no dash). [A-Za-z0-9\-]{0,61} # Internal chars are alphanum plus dash. [A-Za-z0-9] # Part last char is alphanum (no dash). \. # Each part followed by literal dot. )* # Zero or more parts before top level domain. (?: # Explicitly specify top level domains. com|edu|gov|int|mil|net|org|biz| info|name|pro|aero|coop|museum| asia|cat|jobs|mobi|tel|travel| [A-Za-z]{2}) # Country codes are exactly two alpha chars. \.? # Top level domain can end in a dot. $ # Anchor to end of string. /ix', $m['host'])) return FALSE; } $m['url'] = $url; for ($i = 0; isset($m[$i]); ++$i) unset($m[$i]); return $m; // return TRUE == array of useful named $matches plus the valid $url. } 

This function utilizes two regexes; one to match a subset of valid generic URIs (absolute ones having a non-empty host), and a second to validate the DNS “dot-separated-parts” host name. Although this function currently validates only HTTP and FTP schemes, it is structured such that it can be easily extended to handle other schemes.

This one works for me very well. (https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?

Here’s a ready-to-go Java version from the Android source code. This is the best one I’ve found.

 public static final Matcher WEB = Pattern.compile(new StringBuilder() .append("((?:(http|https|Http|Https|rtsp|Rtsp):") .append("\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)") .append("\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_") .append("\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?") .append("((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+") // named host .append("(?:") // plus top level domain .append("(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])") .append("|(?:biz|b[abdefghijmnorstvwyz])") .append("|(?:cat|com|coop|c[acdfghiklmnoruvxyz])") .append("|d[ejkmoz]") .append("|(?:edu|e[cegrstu])") .append("|f[ijkmor]") .append("|(?:gov|g[abdefghilmnpqrstuwy])") .append("|h[kmnrtu]") .append("|(?:info|int|i[delmnoqrst])") .append("|(?:jobs|j[emop])") .append("|k[eghimnrwyz]") .append("|l[abcikrstuvy]") .append("|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])") .append("|(?:name|net|n[acefgilopruz])") .append("|(?:org|om)") .append("|(?:pro|p[aefghklmnrstwy])") .append("|qa") .append("|r[eouw]") .append("|s[abcdeghijklmnortuvyz]") .append("|(?:tel|travel|t[cdfghjklmnoprtvwz])") .append("|u[agkmsyz]") .append("|v[aceginu]") .append("|w[fs]") .append("|y[etu]") .append("|z[amw]))") .append("|(?:(?:25[0-5]|2[0-4]") // or ip address .append("[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]") .append("|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]") .append("[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}") .append("|[1-9][0-9]|[0-9])))") .append("(?:\\:\\d{1,5})?)") // plus option port number .append("(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~") // plus option query params .append("\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?") .append("(?:\\b|$)").toString() ).matcher(""); 

I found the following Regex for URLs, tested successfully with 500+ URLs :

/\b(?:(?: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]))|(?:(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[az\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi

I know it looks ugly, but the good thing is that it works. 🙂

Explanation and demo with 581 random URLs on regex101.

Source: In search of the perfect URL validation regex

I tried to formulate my version of url. My requirement was to capture instances in a String where possible url can be cse.uom.ac.mu – noting that it is not preceded by http nor www

 String regularExpression = "((((ht{2}ps?://)?)((w{3}\\.)?))?)[^.&&[a-zA-Z0-9]][a-zA-Z0-9.-]+[^.&&[a-zA-Z0-9]](\\.[a-zA-Z]{2,3})"; assertTrue("www.google.com".matches(regularExpression)); assertTrue("www.google.co.uk".matches(regularExpression)); assertTrue("http://www.google.com".matches(regularExpression)); assertTrue("http://www.google.co.uk".matches(regularExpression)); assertTrue("https://www.google.com".matches(regularExpression)); assertTrue("https://www.google.co.uk".matches(regularExpression)); assertTrue("google.com".matches(regularExpression)); assertTrue("google.co.uk".matches(regularExpression)); assertTrue("google.mu".matches(regularExpression)); assertTrue("mes.intnet.mu".matches(regularExpression)); assertTrue("cse.uom.ac.mu".matches(regularExpression)); //cannot contain 2 '.' after www assertFalse("www..dr.google".matches(regularExpression)); //cannot contain 2 '.' just before com assertFalse("www.dr.google..com".matches(regularExpression)); // to test case where url www must be followed with a '.' assertFalse("www:google.com".matches(regularExpression)); // to test case where url www must be followed with a '.' //assertFalse("http://wwwe.google.com".matches(regularExpression)); // to test case where www must be preceded with a '.' assertFalse("https://[email protected]".matches(regularExpression)); 

For Python, this is the actual URL validating regex used in Django 1.5.1:

 import re regex = re.compile( r'^(?:http|ftp)s?://' # http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[AZ]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... r'localhost|' # localhost... r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|' # ...or ipv4 r'\[?[A-F0-9]*:[A-F0-9:]+\]?)' # ...or ipv6 r'(?::\d+)?' # optional port r'(?:/?|[/?]\S+)$', re.IGNORECASE) 

This does both ipv4 and ipv6 addresses as well as ports and GET parameters.

Found in the code here , Line 44.

whats wrong with plain and simple FILTER_VALIDATE_URL ?

  $url = "http://www.example.com"; if(!filter_var($url, FILTER_VALIDATE_URL)) { echo "URL is not valid"; } else { echo "URL is valid"; } 

I know its not the question exactly but it did the job for me when I needed to validate urls so thought it might be useful to others who come across this post looking for the same thing

The following RegEx will work:

 "@((((ht)|(f))tp[s]?://)|(www\.))([az][-a-z0-9]+\.)?([az][-a-z0-9]+\.)?[az][-a-z0-9]+\.[az]+[/]?[a-z0-9._\/~#&=;%+?-]*@si" 

For convenience here’s a one-liner regexp for URL’s that will also match localhost where you’re more likely to have ports than .com or similar.

 (http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[az]{2,6}|:[0-9]{3,4})\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*) 

You don’t specify which language you’re using. If PHP is, there is a native function for that:

 $url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/'; if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) { // Wrong } else { // Valid } 

Returns the filtered data, or FALSE if the filter fails.

Check it here >>

Hope it helps.

I hope it’s helpful for you…

 ^(http|https):\/\/+[\www\d]+\.[\w]+(\/[\w\d]+)? 

This is a rather old thread now and the question asks for a regex based URL validator. I ran into the thread whilst looking for precisely the same thing. While it may well be possible to write a really comprehensive regex to validate URLs I eventually settled on another way to do things – by using PHP’s parse_url function.

It returns boolean false if the url cannot be parsed. Otherwise it returns the scheme, the host and other information. This may well not be enough for a comprehensive URL check on its own but can be drilled down into for further analysis. If the intent is to simply catch typos, invalid schemes etc it is perfectly adequate.

To Check URL regex would be:

 ^http(s{0,1})://[a-zA-Z0-9_/\\-\\.]+\\.([A-Za-z/]{2,5})[a-zA-Z0-9_/\\&\\?\\=\\-\\.\\~\\%]* 
  • Есть ли способ экспортировать URL-адреса открытых вкладок окна Firefox?
  • Можно ли создать ссылку на конкретное сообщение электронной почты в Outlook?
  • Получить текущий URL-адрес с помощью JavaScript?
  • Как получить идентификатор fragmentа (значение после hashа #) из URL-адреса?
  • Загрузить изображение в таблицуView из URL-адреса iphone sdk
  • Как запретить Firefox скрывать префикс URL http: //?
  • Передача параметра через службу отчетов URL-адресов в sql-сервер
  • Как размещать несколько страниц из разных доменов вместе?
  • Я регулярно вижу gstatic.com в строке состояния, что это за домен?
  • Facebook share link - можете ли вы настроить текст сообщения?
  • URL без «http | https»
  • Interesting Posts

    iTextSharp – отправка PDF в формате PDF в приложении электронной почты

    Что мне нужно установить на каждый диск? SSD против HDD

    Каковы происхождение контрольных и альт-ключей?

    UIImageWriteToSavedPhotosAlbum сохраняет неправильный размер и качество

    как типы с нулевым значением реализуются под капотом в .net?

    Добавить элемент в контекстное меню значка, прикрепленного к панели задач в Windows 7

    Постановка простого оператора if-then-else на одну строку

    Могу ли я установить кодовую страницу KiTTY по умолчанию для UTF-8 вместо ISO-8859-1?

    Как отправить одну команду на несколько ПК по локальной сети (linux)

    INSTALL_FAILED_NO_MATCHING_ABIS при установке apk

    Хостинг веб-сайта у себя дома: порт блокирования ISP 80?

    Можете ли вы сопоставить ключ продукта Windows XP с выпуском пакета обновления?

    Событие запуска приложения WCF

    Lollipop: рисовать позади statusBar с его цветом, установленным на прозрачный

    Сериализация classа, который содержит std :: string

    Давайте будем гением компьютера.