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

На этот вопрос уже есть ответ здесь:

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

В настоящее время у меня есть поле ввода, которое будет определять 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, это работает.

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

 Marian0710 нояб. 2017 г., 10:29
Вот плагин NPMnpmjs.com/package/url-regex
 SebMa22 авг. 2019 г., 23:25
@ jose920405 Мне нравится твое расширенное регулярное выражение, потому что это просто. Я только что проверил это, нужно было немного подправить, чтобы запретить" в URL, т.е.(www|http:|https:)+[^\s"]+[\w]
 Martin Thoma17 авг. 2017 г., 11:35
 Huangism25 мая 2017 г., 16:50
Это помечено для дубликата, но этот вопрос требует JS, а другой вопрос не просит JS решение
 jose92040523 окт. 2017 г., 21:03
(www|http:|https:)+[^\s]+[\w]
 Mukul Jain11 окт. 2018 г., 09:17
Это должно сделать этоregex101.com/r/S2CbwM/1
 paleozogt20 июн. 2012 г., 21:03
Джона ГрубераТочный шаблон регулярных выражений для сопоставления URL-адресов это тоже хорошо. Увидетьэтот ТАК вопрос о том, как изменить его для работы в Javascript.
 Mohammed Akdim11 мая 2017 г., 18:52
«/(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+# -] * [\ ш @ ^ =% & амп;? \ / ~ + # -]) /»

Ответы на вопрос(6)

ример, google.com) и, если оно проверяет, включить кнопку отправки. Я думал, что поделюсь своим кодом для тех, кто хочет сделать что-то подобное. Ожидается домен без каких-либо http: // или www. значение. Сценарий использует сокращенное регулярное выражение сверху для сопоставления доменов, что не является строгим в отношении поддельного 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-\\[email protected]:%_\+~#=]+)+((\\.[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>

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

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

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

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

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

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

if (t.match(regex)) {
  alert("Successful match");
} else {
  alert("No match");
}

 Daveo26 янв. 2012 г., 12:02
хорошо, этот будет соответствовать[[email protected]:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b([[email protected]:%_\+.~#?&//=]*)?
 nomis15 мая 2013 г., 18:09
Это не работает с параметрами запроса, напримерbooking.com/hotel/id/...
 Daveo28 сент. 2010 г., 05:16
Для упоминания использовать этот сайтgskinner.com/RegExr  протестировать Regex и просмотреть общие образцы
 dmnc24 янв. 2012 г., 15:42
В вашем примере строка запросаRegExr.com?2rjl6 не пойман.
 Vladimir Vlasov25 дек. 2018 г., 06:46
Я запутался// в последней группе. Должно ли это быть\/?
 Andrea_8623 июл. 2015 г., 16:05
это также соответствует http (s)?: //www.blablabla.something ((https?: \ / \ /) | (www \.) | (https?: \ / \ / www \.)) ([a- Za-z0-9 -_] {2,256}) \ ([AZ] {2,4}) \ Ъ ([- а-Za-z0-9 @:.?.% _ \ + ~ # & = // ] *)
 DomeTune25 июл. 2017 г., 11:17
Матчи...and
 Eyad Mohammed Osama22 июл. 2019 г., 02:00
Диего Перини сделал очень хорошее регулярное выражение, охватывающее почти все возможные случаи, вы можете проверить это здесь:mathiasbynens.be/demo/url-regex
 VeryLazyBoy30 апр. 2018 г., 04:12
Он считает этот неверный URLwww.baidu.com:443.us/path/to/the/file как действительный
 transang29 мар. 2019 г., 08:46
это работает сhttp://localhost:3000
 Tomty22 мар. 2018 г., 06:35
Если вы используете python, обязательно используйте необработанные строки или экранируйте "\ b", иначе это не сработает:stackoverflow.com/q/3995034/3412775.
 Francis04 февр. 2017 г., 11:32
Если вы хотите, чтобы Regex распознавал заглавные или смешанные буквы, вам следует изменить. [Az] {2,4} на. [A-zA-Z] {2,4} Вы также можете рассмотреть возможность изменения диапазона соответствующих номеров с {2,4} поскольку доменные имена в наши дни становятся все длиннее и длиннее (например, .consulting, .marketing, .shopping и т. Д.)
 Falcon04 февр. 2015 г., 14:59
это не соответствует URL, содержащему, такие какhttp://res.cloudinary.com/hrscywv4p/image/upload/c_fill,g_faces:center,h_128,w_128/yflwk7vffgwyyenftkr7.png, Незначительное редактирование, чтобы исправить это[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&//=,]*)
 Jesse Fulton08 апр. 2012 г., 19:43
Это по-прежнему соответствует URL-адресам без действительного ДВУ, т. Е. "Foo / file.html"
 bigbob28 сент. 2010 г., 05:56
Как я могу использовать в контексте javascritp? когда я добавляю это на веб-сайт .. JavaScript больше не работает .. я думаю, что они являются ошибкой
 Amin Jafari26 нояб. 2016 г., 08:21
это возвращает недействительнымhttps://en.wikipedia.org/wiki/Harry_Potter_(film_series)
 Nabi K.A.Z.16 апр. 2017 г., 15:22
Это не нашел мой сайт:http://www.نبی.com/ :-D
 Derek Prior05 июл. 2012 г., 20:53
regex.test ('//. com') => true
 Imamudin Naseem13 февр. 2017 г., 06:21
не работает, если в URL есть пробелы. t = 'www.google.com withspace' t.match (regex) // возвращает true
 Rahul Desai09 окт. 2015 г., 02:48
Вот улучшенная версия Regex @ Daveo, которая работала лучше всего для меня:regex101.com/r/hU9aV3/2
 dmnc26 янв. 2012 г., 01:26
@Daveo. Теперь я оглядываюсь назад на ссылку gskinner.com/RegExr, которую я использовал для тестирования (результаты можно увидеть здесьregexr.com?2s715), он встроен во Flash. Может быть, он вообще не использует движок javascript regex ...
 Daveo24 янв. 2012 г., 23:17
@dmnc да, это так. Я скопировал и вставил код в firebug и изменил www.google.com на regexr.com?2rji6, и он предупредил об успешном совпадении
 Derek 朕會功夫21 мар. 2014 г., 08:01
Не работает для URL с неанглийскими символами:"http://正妹.香港/‎" false
 technophyle12 янв. 2018 г., 17:38
Это не обнаруживаетlocalhost как URL.
 Daveo28 сент. 2010 г., 06:26
Я обновил свой оригинальный ответ, чтобы показать полный пример JavaScript для регулярного выражения. Я также немного изменил регулярное выражение
 elundmark12 мар. 2013 г., 11:11
Не забудьте про номера портов: "example.com:80/test"/[[email protected]:%_\+.~#?&//=]]2,256 enj\.[az]]2,4 enj(\:[0-9]+)? \ Ь (\ / [- A-Za-Z0-9 @:.?% _ \ + ~ # & // =] *)? / ги
 serdarsenay13 мар. 2019 г., 14:21
хороший ответ, но вы пропустили символ звезды \ *, поэтому полная допустимая строка: https?: \ / \ / (www \.)? [- a-zA-Z0-9 @:% ._ \ + ~ # = \ *] {2,256} \. [Az] {2,6} \ b ([- a-zA-Z0-9 @:% _ \ +. ~ #? & // = \ *] *) посмотрите здесьstackoverflow.com/questions/1547899/...
 mkaj08 окт. 2016 г., 08:33
Это не соответствует щебетать ссылки, которые просто t.co Нужно изменить {2,256} на {1,256}
 Saurabh Sharma24 мая 2019 г., 11:14
Как это может быть действительным URLhttp://google.com...... ?
 Daveo01 июл. 2019 г., 04:02
@JustinA обновлен для работы - смотрите здесьregexr.com/3e6m0
 Saurabh Sharma24 мая 2019 г., 13:49
@Daveo Кроме того, как это может быть действительным URLhttps://www.google_.com?
 1020rpz31 мая 2019 г., 17:49
Это регулярное выражение будет соответствовать всем URL с более чем одной точкой, какwww...google...comнужно проверить на \. быть равным только одному. Попробуйте это регулярное выражение, так как оно лучше работает с точками.^https?:\/\/(www\.)?([[email protected]:%_\+~#=]{2,256}(\.){1})+[a-z]{2,6}\b(\/[[email protected]:%._?&\/+~#=]{2,256}|:[0-9]{2,})*, кто-то знает, как это изменить и избежатьwww.aa  ??
 Antzi05 апр. 2016 г., 16:44
Это не верно. gtlds может быть длиннее 6 символов и содержать символы не ascii.
 Daveo28 сент. 2010 г., 05:42
Смотри сюдаregexr.com?2s81g     Вы можете увидеть в примере текста, который соответствует регулярному выражению URL, выделены синим цветом
 Daniel Cairol11 авг. 2015 г., 19:17
вопрос - почему двойная косая черта внутри последнего класса символов? в этой части регулярного выражения [-a-zA-Z0-9 @:% _ \ +. ~ #? & // =] есть двойная косая черта, которая не кажется мне необходимой? Вы помещаете дважды один и тот же символ в класс символов, и если вы намеревались избежать обычного слеша, это будет бесполезно, поскольку экранирование выполняется с обратным слешем? ...
 bigbob28 сент. 2010 г., 05:23
var urlRegex = / (https?: //)? (www \.)? ([a-zA-Z0-9_%] *) \ b \. [az] {2,4} (\. [az] { ? 2}) ((/ [A-Za-Z0-9 _%] *) +) (\ [AZ] *) $ /?.?; Это так? тоже не работает.
 jahooma21 мая 2018 г., 11:38
Удалите два символа '\ /' после '\ b (', чтобы исправить ошибку несоответствия? Query = hi. Кроме того, измените '{2,4}' на '{1,4}', так как есть некоторые однобуквенные домены.
 Luke McGregor23 февр. 2015 г., 23:32
http://www.c:ool.com.au не должен быть действительным URL, должен быть не более одного: после// и это должно сопровождаться цифрами, а затем/ или же? или конец URL
 Justin A29 июн. 2019 г., 09:27
Я не ожидаю, что это регулярное выражение будет обрабатывать все крайние случаи, как указано выше, но вот простой случай использования, который я использую все время в реальной жизниhttp://192.168.1.19 или жеhttp://192.168.1.19:5000 это должно быть действительным, но терпит неудачу.
 Jeff Tian31 мар. 2016 г., 07:46
Это не работает длялокальный: 60001 / # / вкладка / тир». /[[email protected]:%_\+.~#?&//=]{2,256}\.[az]{2,4}\b(\/[-a-zA-Z0 -9 @:.?% _ \ + ~ # & // =] *) / gi.test (»локальная: 60001 / # / вкладки / тир»); ложный
 Aurimas N.30 апр. 2018 г., 08:30
@AminJafari это должно соответствовать вашему примеру:https?:\/\/(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&\/=()]*)
 Siva14 июн. 2017 г., 08:57
Это не работает дляhttp://12.23.12.23:8080/example хотя это действительно
 Sunny14 февр. 2019 г., 11:57
Не следует использовать в производстве. Это также говоритtrue за\\\\\\||||@@@@https://www.google.com

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

 function isURL(str) {
     var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)[email protected])?(?:(?:(?:[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);
}
 Ruben Martinez Jr.01 мая 2017 г., 22:44
Стоит отметитьэто может привести к сбою вашего браузера, Смотрите пример:jsfiddle.net/Lrnambtt/9
 rinogo09 нояб. 2017 г., 15:46
Просто немного больше информации на комментарий @RubenMartinezJr. - Этоделает максимально использовать процессор в Chrome и Firefox (Mac OS), но интересноне максимально использовать процессор в Safari.

указанное выше, не помогло мне в разборе параметров строки запроса.

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

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

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

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

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

 Moreno12 февр. 2013 г., 19:57
var regex = /^(http[s]?:\/\/(www\.)?|ftp:\/\/(www\.)?|www\.){1}([0-9A-Za-z-\[email protected]:%_\+~#=]+)+((\.[a-zA-Z]{2,3})+)(\/(.)*)?(\?(.)*)?/g; работает для меня
 Tony24 апр. 2013 г., 00:30
хорошее решение, но не дляfoo.co.uk... должен быть установлен в это var regex = new RegExp ("^ (http [s]?: \\ / \\ / (www \\.)? | ftp: \\ / \\ / (www \\. ) | (WWW \\)) {1} ([0-9A-Za-Z - \\ @:.% _ \ + ~ # =]?.?. +) + ((\\ [а-запорожец Z] {2,3}) +) (/ () *) (\\ () *) ").?.?; Спасибо Амар.
(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.grhttps://www.foufos.grhttp://foufos.grhttp://www.foufos.gr/kinohttp://werer.grwww.foufos.grwww.mp3.comwww.t.cohttp://t.cohttp://www.t.cohttps://www.t.cowww.aa.comhttp://aa.comhttp://www.aa.comhttps://www.aa.com

НЕ будет соответствовать следующему

www.foufoswww.foufos-.grwww.-foufos.grfoufos.grhttp://www.foufoshttp://foufoswww.mp3#.com

var expression = /(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,})/gi;
var regex = new RegExp(expression);

var check = [
  'http://www.foufos.gr',
  'https://www.foufos.gr',
  'http://foufos.gr',
  'http://www.foufos.gr/kino',
  'http://werer.gr',
  'www.foufos.gr',
  'www.mp3.com',
  'www.t.co',
  'http://t.co',
  'http://www.t.co',
  'https://www.t.co',
  'www.aa.com',
  'http://aa.com',
  'http://www.aa.com',
  'https://www.aa.com',
  'www.foufos',
  'www.foufos-.gr',
  'www.-foufos.gr',
  'foufos.gr',
  'http://www.foufos',
  'http://foufos',
  'www.mp3#.com'
];

check.forEach(function(entry) {
  if (entry.match(regex)) {
    $("#output").append( "<div >Success: " + entry + "</div>" );
  } else {
    $("#output").append( "<div>Fail: " + entry + "</div>" );
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="output"></div>

Проверьте это в рубрике - новая версия

Проверьте это по-русски - старая версия

 webta.st.ic25 июн. 2019 г., 13:42
Привет и спасибо за это регулярное выражение! Вопрос: я попытался добавить возможность использовать ссылки в интрасети, например, например.http://intranet/index.html а такжеmailto напримерmailto:[email protected], Пробовал это регулярное выражение:/^((http(s)?)|(ftp(s)?):\/\/(?: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,})|(mailto:){1}([\w\.]+)\@{1}[\w]+\.[\w]{2,})\s$/gm но это не сработало для двух примеров ниже. В чем дело?
 Vinicius Tavares17 авг. 2015 г., 17:04
Это регулярное выражение больше не действует, поскольку новые пользовательские рДВУ могут иметь такие URL-адреса, какcalendar.google
 Ismael14 янв. 2015 г., 12:08
Извините, в комментарии h-t-t-p -: - / - / был продезинфицирован!
 Augustin Riedinger22 нояб. 2017 г., 11:25
Это соответствует поддоменам? подобноhttp://docs.google.com?
 foufos23 нояб. 2017 г., 11:13
@ augustin-riedinger Это будет соответствовать, если http или https добавленыhttp://docs.google.com будет соответствовать, ноdocs.google.com не будет соответствовать
 Marek10 июл. 2016 г., 06:08
Другая проблема с этим регулярным выражением?!отрицательные упреждения не поддерживаются некоторыми библиотеками, в частности библиотекой регулярных выражений Go, поскольку тогда временная сложность O (n) больше не гарантируется.
 Lothar17 апр. 2016 г., 22:24
Кто больше заботится о специальном поддомене www? Никто!
 foufos29 дек. 2015 г., 22:35
@ajeetlakhani вы можете просто добавить / к последней группе недопустимых символов(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s\/]{2,}|www\.[^\s]+\.[^\s\/]{2,})
 Ajeet Lakhani28 дек. 2015 г., 21:21
Что делать, если мы должны удалить веб-страницу и сделать это только для веб-сайтов. Я имею в виду, если мы удалимhttp://www.foufos.gr/kino из совпавших случаев. что бы изменить в регулярных выражениях?
 webta.st.ic01 июл. 2019 г., 09:25
Привет @foufos Я сделал работу RegEx для моих необходимых дел:/^(((http(s)?|(ftp(s)?)):\/\/)(www\.)?([a-zA-Z0-9][a-zA-Z0-9\.\/-]+[a-zA-Z0-9]\.[^\s]{2,})+(\:[0-9]{5})?|(mailto:){1}([\w\.]+)\@{1}[\w]+\.[\w]{2,})\s$/gm; Вот также тест регулярного выражения:regex101.com/r/XFvQjr/4 Спасибо!
 Qiang14 мар. 2016 г., 20:28
но это будет соответствоватьhttp://www.foufos  и не будет соответствоватьregex.com
 Ruben Martinez Jr.01 мая 2017 г., 22:54
К сожалению, это также поймает "www.example.com.", Который, я думаю, заканчивается на "." также недействителен.
 Mrugesh Tank25 мар. 2017 г., 12:42
это верно дляwww.mp3#.com что я считаю неправильным
 foufos01 июл. 2019 г., 09:12
@ webta.st.ic Вы можете добавить|https?:\/\/[^\s]+|mailto:[^\s]+ как раз перед закрывающей скобкой и запишите эти два случая. Что он делает, так это говорит, что если у вас есть строка, начинающаяся сhttp:// или жеhttps:// или жеmailto: тогда захватите это. Это также захватывает два случая, не захваченные исходным выражением (http://www.foufos, http://foufos)
 Ismael14 янв. 2015 г., 12:08
Я немного изменил ваше выражение, чтобы оно работало во всех нужных мне случаях, включая uri с http: // илиWWW "/([^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi"
 foufos03 мая 2017 г., 12:26
@ ruben-martinez-jr, вы можете добавить "." или любую другую пунктуацию, которая вам нравится, в части [^ \ s], но вы пропустите URL, например "www.example.com/test.html"
 foufos31 мар. 2017 г., 00:12
@ mrugesh-tank Я отредактировал регулярное выражение

попробуй это

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

Ваш ответ на вопрос