Как я могу проверить, является ли данная строка действительным адресом URL?
Мои знания регулярных выражений являются базовыми и не позволяют мне выбирать из сотен регулярных выражений, которые я уже видел в Интернете.
regex
url
language-agnostic
Витор Сильва
источник
источник
Ответы:
Я написал свой шаблон URL (на самом деле IRI, интернационализированный) в соответствии с RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ). Они в синтаксисе PCRE.
Для абсолютных IRI (интернационализированных):
Чтобы также разрешить относительные IRI:
Как они были скомпилированы (в PHP):
Редактировать 7 марта 2011 года. Из-за способа, которым PHP обрабатывает обратную косую черту в строках в кавычках, по умолчанию их нельзя использовать. Вам потребуется двойная экранирование обратной косой черты, за исключением случаев, когда обратная косая черта имеет особое значение в регулярном выражении. Вы можете сделать это следующим образом:
источник
http://com
это действительный URL.http://localhost
есть, почему не было бы других слов? Вы правы, чтоu
модификатор необходим в PHP. Я хочу пояснить, что, хотя я генерировал их с помощью PHP, они не предназначены для конкретных PHP.Я только что написал сообщение в блоге для отличного решения для распознавания URL в большинстве используемых форматов, таких как:
www.google.com
http://www.google.com
mailto:somebody@google.com
somebody@google.com
www.url-with-querystring.com/?url=has-querystring
Используемое регулярное выражение:
источник
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
иmargin:3px
Какая платформа? Если вы используете .NET, используйте
System.Uri.TryCreate
, а не регулярное выражение.Например:
(Спасибо @Yoshi за совет о
javascript:
)источник
javascript: alert('blah')
. Вам необходимо провести дополнительную проверку Uri.Scheme, чтобы убедиться, что используется протокол http / https / ftp, в противном случае, если такой URL-адрес будет вставлен в HTML-код страниц ASP.NET в качестве ссылки, ваши пользователи будут уязвимы для атак XSS .Uri.IsWellFormedUriString()
Вот что использует RegexBuddy .
Это соответствует этим ниже (внутри
** **
отметок):Вы можете скачать RegexBuddy по адресу http://www.regexbuddy.com/download.html .
источник
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
Что касается поста ответа века , который гласит «Это основано на моем прочтении спецификации URI.»: Спасибо «Веко», ваше идеальное решение, которое я искал, так как оно основано на спецификации URI! Отличная работа. :)
Я должен был сделать две поправки. Первое, чтобы получить регулярное выражение для правильного соответствия URL-адресов IP-адресов в PHP (v5.2.10) с помощью функции preg_match ().
Мне пришлось добавить еще один набор скобок в строку выше «IP-адрес» вокруг каналов:
Не уверен почему.
Я также уменьшил минимальную длину домена верхнего уровня с 3 до 2 букв для поддержки .co.uk и аналогичных.
Финальный код:
Эта измененная версия не была проверена на соответствие спецификации URI, поэтому я не могу ручаться за ее соответствие, она была изменена для обработки URL-адресов в средах локальной сети и двухзначных TLD, а также для других типов веб-URL и для лучшей работы в PHP настройки я использую.
Как код PHP :
Вот тестовая программа на PHP, которая проверяет различные URL-адреса с помощью регулярного выражения:
Еще раз спасибо веко за регулярное выражение!
источник
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
на')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
". Я сделал соответствующие изменения на основе этого комментария./^(https?|ftp):
(протокол) Почему вы запрещаете протоколы, такие как data, file, svn, dc ++, magnet, skype или любые другие, поддерживаемые браузером, имеющим соответствующий плагин или сервер?У Матиаса Биненса есть отличная статья о лучшем сравнении многих регулярных выражений: в поисках идеального регулярного выражения валидации URL
Лучший из опубликованных материалов является немного длинным, но он подходит практически ко всему, что вы можете на него бросить.
Версия JavaScript
Версия PHP
источник
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
В посте « Получение частей URL (Regex)» обсуждается разбор URL для определения его различных компонентов. Если вы хотите проверить, правильно ли сформирован URL-адрес, его должно быть достаточно для ваших нужд.
Если вам нужно проверить, действительно ли это действительно так, вам, в конце концов, придется попытаться получить доступ к тому, что находится на другом конце.
В целом, однако, вам, вероятно, было бы лучше использовать функцию, предоставленную вам вашей платформой или другой библиотекой. Многие платформы включают функции, которые анализируют URL-адреса. Например, есть модуль urlparse в Python , а в .NET вы можете использовать конструктор класса System.Uri в качестве средства проверки URL.
источник
Это может быть работа не для регулярных выражений, а для существующих инструментов на выбранном вами языке. Вы, вероятно, хотите использовать существующий код, который уже написан, протестирован и отлажен.
В PHP используйте
parse_url
функцию.Perl:
URI
модуль .Рубин:
URI
модуль ..NET: класс "Ури"
Регулярные выражения - это не волшебная палочка, которую вы машете при каждой проблеме, которая связана со строками.
источник
java.net.URL
.Не проверяющий парсер URI-ссылки
Для справки, вот спецификация IETF: ( TXT | HTML ). В частности, Приложение B. Анализ ссылки на URI с помощью регулярного выражения демонстрирует, как анализировать правильное регулярное выражение . Это описано как,
Вот регулярное выражение, которое они предоставляют:
Как сказал кто-то еще, вероятно, лучше оставить это уже используемой вами lib / framework.
источник
Это будет соответствовать всем URL
... включая субдомены и новые расширения доменных имен верхнего уровня, такие как. музей . академия . фундамент и т.д. , которые могут иметь до 63 символов (не только. ком ,. чистая ,. Информация и т.д.)
Потому что сегодня максимальная длина доступного расширения доменного имени верхнего уровня составляет 13 символов, например. международная , вы можете изменить число 63 в выражении на 13, чтобы предотвратить злоупотребление.
как JavaScript
Статья Википедии: Список всех интернет доменов верхнего уровня
источник
t.co
. Как бы вы отрегулировали его для этих случаев?Лучшее регулярное выражение для 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})*)?
\w
с\p{L}
минимальным.([\d\w][-\d\w]{0,253}[\d\w]\.)+
в([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(добавить знак вопроса в конце его)Соответствует http://site.com/dir/file.php?var=moo | FTP: // пользователь: pass@site.com: 21 / файл / реж
Несоответствия site.com | http://site.com/dir//
источник
http://www.goo gle.com
будет соответствовать.Матчи http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
источник
Я не смог найти регулярное выражение, которое искал, поэтому я изменил регулярное выражение, чтобы полностью удовлетворить мои требования, и, похоже, теперь оно работает нормально. Мои требования были:
Вот то, что я придумал, приветствуется любое предложение:
источник
Если вы действительно ищете окончательное совпадение, вы, вероятно, найдете его в « A Good Url Regular Expression? ».
Но регулярное выражение, которое действительно соответствует всем возможным доменам и разрешает все, что разрешено в соответствии с RFC, ужасно долго и нечитаемо, поверьте мне ;-)
источник
Я работал над углубленной статьей, обсуждающей проверку URI с помощью регулярных выражений. Он основан на RFC3986.
Проверка URI регулярного выражения
Хотя статья еще не завершена, я разработал функцию PHP, которая довольно хорошо справляется с проверкой URL-адресов HTTP и FTP. Вот текущая версия:
Эта функция использует два регулярных выражения; один для соответствия подмножеству допустимых универсальных URI (абсолютные имеют непустой хост), а второй для проверки DNS-имени хоста «разделенные точками части» DNS. Хотя в настоящее время эта функция проверяет только схемы HTTP и FTP, она структурирована таким образом, что ее можно легко расширить для обработки других схем.
источник
я написал небольшую отличную версию, которую вы можете запустить
это соответствует следующим 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 (и все его перестановки)
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 *
источник
-
в URL.Я использую это регулярное выражение:
Для поддержки обоих:
А также:
источник
((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})*)?
((?: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})*)?
Вот хорошее правило, которое охватывает все возможные случаи: порты, параметры и т. Д.
источник
Этот работает для меня очень хорошо.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
источник
Вот готовая версия Java из исходного кода Android. Это лучший, который я нашел.
источник
Вот регулярное выражение, которое я сделал, который извлекает различные части из URL:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(группа 1) : извлекает протокол([^:/\s.]+\.[^:/\s]|localhost)
(группа 2) : извлекает имя хоста(:\d+)?
(группа 3) : извлекает номер порта((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(группы 4 и 5) : извлекает часть пути([^#]+)?
(группа 6) : извлекает часть запроса(#[\w-]+)?
(группа 7) : извлекает часть хешаДля каждой части регулярного выражения, перечисленного выше, вы можете удалить окончание,
?
чтобы заставить его (или добавить, чтобы сделать его факультативным). Вы также можете удалить^
в начале и$
в конце регулярное выражение, чтобы ему не требовалось совпадать со всей строкой.Смотрите это на regex101 .
Примечание: это регулярное выражение не является безопасным на 100% и может принимать некоторые строки, которые не обязательно являются действительными URL-адресами, но действительно проверяют некоторые критерии. Его основная цель состояла в том, чтобы извлечь различные части URL, чтобы не проверять его.
источник
Для Python это фактическое регулярное выражение проверки URL, используемое в Django 1.5.1:
Это касается как адресов ipv4, так и адресов ipv6, а также портов и параметров GET.
Найдено в коде здесь , строка 44.
источник
Я нашел следующее регулярное выражение для URL, успешно протестированное с 500+ URL :
/\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]))|(?:(?:[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]*)?\b/gi
Я знаю, это выглядит ужасно, но хорошо, что это работает. :)
Объяснение и демонстрация с 581 случайным URL на regex101.
Источник: в поисках идеального регулярного выражения для проверки URL
источник
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
Я попытался сформулировать свою версию URL. Мое требование состояло в том, чтобы захватывать экземпляры в строке, где возможный URL может быть cse.uom.ac.mu - отмечая, что ему не предшествуют ни http, ни www.
источник
ht{2}ps?
а не тогдаhttps?
что не так с простым и простым FILTER_VALIDATE_URL?
Я точно знаю, что вопрос не в этом, но он сделал свою работу для меня, когда мне нужно было проверить URL, поэтому подумал, что это может быть полезно для других, кто сталкивается с этим постом, ища то же самое
источник
Будет работать следующий RegEx:
источник
Используйте этот, он работает для меня
источник
Для удобства приведем однострочное регулярное выражение для URL, которое также будет соответствовать localhost, где у вас больше шансов иметь порты, чем
.com
аналогичные.источник
Вы не указываете, какой язык вы используете. Если PHP есть, для этого есть встроенная функция:
Возвращает отфильтрованные данные или FALSE в случае сбоя фильтра.
Проверьте это здесь >>
Надеюсь, поможет.
источник