Какое регулярное выражение лучше всего проверить, является ли строка допустимым URL-адресом? - PullRequest
719 голосов
/ 02 октября 2008

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

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

Ответы [ 52 ]

3 голосов
/ 10 декабря 2018

Вот регулярное выражение, которое я сделал, который извлекает различные части из 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, чтобы не проверять его.

3 голосов
/ 09 октября 2015

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

2 голосов
/ 28 мая 2014

Используйте это, это работает для меня

function validUrl(Url) {
    var myRegExp  =/^(?:(?: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\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i;

    if (!RegExp.test(Url.value)) {
        $("#urlErrorLbl").removeClass('highlightNew');
        return false;
    } 

    $("#urlErrorLbl").addClass('highlightNew'); 
    return true; 
}
2 голосов
/ 09 октября 2013

Будет работать следующий RegEx:

"@((((ht)|(f))tp[s]?://)|(www\.))([a-z][-a-z0-9]+\.)?([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+[/]?[a-z0-9._\/~#&=;%+?-]*@si"
2 голосов
/ 06 декабря 2012

Я попытался сформулировать свою версию URL. Мое требование состояло в том, чтобы захватывать экземпляры в строке, где возможный URL-адрес может быть cse.uom.ac.mu - отмечая, что ему не предшествуют ни http, ни 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://www@.google.com".matches(regularExpression));
2 голосов
/ 19 июня 2013

что не так с простым и простым 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";
  }

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

2 голосов
/ 07 мая 2013

Для Python это фактическое регулярное выражение проверки URL, используемое в 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])?\.)+(?:[A-Z]{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)

Это касается адресов ipv4 и ipv6, а также портов и параметров GET.

Находится в коде здесь , строка 44.

2 голосов
/ 14 мая 2015

Вы не указываете, какой язык вы используете. Если PHP есть, для этого есть встроенная функция:

$url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/';

if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
    // Wrong
}
else {
    // Valid
}

Возвращает отфильтрованные данные или FALSE в случае сбоя фильтра.

Проверьте это здесь >>

Надеюсь, это поможет.

2 голосов
/ 09 декабря 2014

Для удобства приведем однострочное регулярное выражение для URL, которое также будет соответствовать localhost, где у вас больше шансов иметь порты, чем .com или аналогичный.

(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6}|:[0-9]{3,4})\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)
2 голосов
/ 30 августа 2017

Надеюсь, это полезно для вас ...

^(http|https):\/\/+[\www\d]+\.[\w]+(\/[\w\d]+)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...