Что такое хорошее регулярное выражение для соответствия URL? [Дубликат]

229

В настоящее время у меня есть поле ввода, которое будет определять URL-адрес и анализировать данные.

Итак, сейчас я использую:

var urlR = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)
           (?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url= content.match(urlR);

Проблема в том, что когда я ввожу URL-адрес, например www.google.com, он не работает. когда я ввел http://www.google.com, он работает.

Я не очень свободно говорю о регулярных выражениях. Кто-нибудь может мне помочь?

Показать ещё 5 комментариев
Теги:

6 ответов

361

Regex, если вы хотите, чтобы URL-адрес начинался с HTTP/HTTPS:

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)

Если вам не нужен протокол HTTP:

[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)

Чтобы попробовать это, см. Http://regexr.com?37i6s, или для версии, которая является менее ограничительной http://regexr.com/3e6m0.

Пример реализации JavaScript:

var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
var regex = new RegExp(expression);
var t = 'www.google.com';

if (t.match(regex)) {
  alert("Successful match");
} else {
  alert("No match");
}
  • 18
    Для упоминания используйте этот сайт gskinner.com/RegExr для тестирования Regex и просмотра общих примеров
  • 0
    var urlRegex = / (https?: //)? (www \.)? ([a-zA-Z0-9_%] *) \ b \. [az] {2,4} (\. [az] { ? 2}) ((/ [A-Za-Z0-9 _%] *) +) (\ [AZ] *) $ /?.?; Это так? тоже не работает.
Показать ещё 35 комментариев
128
(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})

Соответствует следующим случаям

  • http://www.foufos.gr
  • https://www.foufos.gr
  • http://foufos.gr
  • http://www.foufos.gr/kino
  • http://www.t.co
  • http://t.co
  • http://werer.gr
  • www.foufos.gr
  • www.mp3.com
  • www.t.co

НЕ соответствует следующим

  • www.foufos
  • http://www.foufos
  • http://foufos
  • www.mp3#.com
  • www.foufos-.gr
  • www.-foufos.gr

Проверьте его в rubular - NEW version

Проверьте его в rubular - старой версии

  • 1
    Я немного изменил ваше выражение, чтобы оно работало во всех нужных мне случаях, включая uri с http: // или www "/ ([^ \ s \.] + \. [^ \ S] {2,} | www \ . [^ \ s] + \. [^ \ s] {2,}) / ги»
  • 0
    Извините, в комментарии http -: - / - / был продезинфицирован!
Показать ещё 12 комментариев
37

Это дроиды, которые вы ищете. Это взято из validator.js, который является библиотекой, которую вы действительно должны использовать для этого. Но если вы хотите бросить свой собственный, кто я, чтобы вас остановить? Если вы хотите чистое регулярное выражение, вы можете просто снять проверку длины. Я думаю, что неплохо проверить длину URL-адреса, хотя если вы действительно хотите определить соответствие спецификации.

 function isURL(str) {
     var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-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,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
     var url = new RegExp(urlRegex, 'i');
     return str.length < 2083 && url.test(str);
}
  • 8
    Стоит отметить, что это может привести к сбою вашего браузера . Смотрите пример: jsfiddle.net/Lrnambtt/9
  • 1
    Просто немного больше информации на комментарий @RubenMartinezJr. - он делает максимум из процессора на Chrome и Firefox (Mac OS), но интересно не максимум из процессора на Safari.
18

Еще одно возможное решение, выше решения для меня не удалось при анализе параметров строки запроса.

var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\\/\\/(www\\.)?|www\\.){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");

if(regex.test("http://google.com")){
  alert("Successful match");
}else{
  alert("No match");
}

В этом решении вы можете изменить [-0-9A-Za-z\.@:%_\+~#=, чтобы соответствовать имени домена/поддомена. В этом решении также задаются параметры строки запроса.

Если вы не используете RegEx, то из выражения замените \\ на \.

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

  • 1
    var regex = /^(http[s]?:\/\/(www\.)?|ftp:\/\/(www\.)?|www\.){1}([0-9A-Za-z-\.@:%_\+~#=]+)+((\.[a-zA-Z]{2,3})+)(\/(.)*)?(\?(.)*)?/g; работает для меня
  • 0
    Выше решение также не удалось для меня. Этот идеален.
Показать ещё 3 комментария
8

попробуйте это

(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?
  • 1
    Это регулярное выражение уязвимо для REDOS. Пожалуйста, удалите этот пост. DM me @TheDavisJam, если у вас есть вопросы.
2

Я пытался собрать JavaScript для проверки имени домена (например, google.com), и если он проверяет, активируйте кнопку отправки. Я думал, что я поделюсь своим кодом для тех, кто ищет что-то подобное. Он ожидает домен без каких-либо http://или www. стоимость. script использует урезанное регулярное выражение сверху для согласования доменов, которое не является строгим в отношении поддельного TLD.

http://jsfiddle.net/nMVDS/1/

$(function () {
  $('#whitelist_add').keyup(function () {
    if ($(this).val() == '') { //Check to see if there is any text entered
        //If there is no text within the input, disable the button
        $('.whitelistCheck').attr('disabled', 'disabled');
    } else {
        // Domain name regular expression
        var regex = new RegExp("^([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");
        if (regex.test($(this).val())) {
            // Domain looks OK
            //alert("Successful match");
            $('.whitelistCheck').removeAttr('disabled');
        } else {
            // Domain is NOT OK
            //alert("No match");
            $('.whitelistCheck').attr('disabled', 'disabled');
        }
    }
  });
});

ФОРМА HTML:

<form action="domain_management.php" method="get">
    <input type="text" name="whitelist_add" id="whitelist_add" placeholder="domain.com">
    <button type="submit" class="btn btn-success whitelistCheck" disabled='disabled'>Add to Whitelist</button>
</form>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню