Регулярное выражение для проверки URL (в JavaScript) - PullRequest
22 голосов
/ 11 сентября 2009

Есть ли у кого-нибудь регулярное выражение для проверки URL (НЕ для нахождения их в текстовом отрывке)? Фрагмент JavaScript будет предпочтительным.

Ответы [ 11 ]

49 голосов
/ 01 апреля 2013

В принятом ответе bobince понял все правильно: обычно достаточно проверки только имени схемы,: //, пробелов и двойных кавычек. Вот как проверка может быть реализована в JavaScript:

var url = 'http://www.google.com';
var valid = /^(ftp|http|https):\/\/[^ "]+$/.test(url);
// true

или

var r = /^(ftp|http|https):\/\/[^ "]+$/;
r.test('http://www.goo le.com');
// false

или

var url = 'http:www.google.com';
var r = new RegExp('/^(ftp|http|https):\/\/[^ "]+$/');
r.test(url);
// false

Ссылки на синтаксис:

27 голосов
/ 11 сентября 2009

Фактический синтаксис URL довольно сложен и его нелегко представить в регулярном выражении. Большинство простых на вид регулярных выражений даст много ложных отрицаний, а также ложных срабатываний. См. Для развлечения эти усилия , но даже конечный результат не очень хороший.

Кроме того, в наши дни вы, как правило, хотите разрешить IRI, а также URI старой школы, чтобы мы могли ссылаться на действительные адреса, например:

http://en.wikipedia.org/wiki/Þ
http://例え.テスト/

Я бы пошел только для простых проверок: начинается ли он с хорошо известного метода: name? Это без пробелов и двойных кавычек? Если так, то, черт возьми, это, вероятно, достаточно хорошо.

16 голосов
/ 03 мая 2012

Попробуйте это регулярное выражение

/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

Это работает лучше всего для меня.

5 голосов
/ 15 марта 2017

Я нашел некоторый успех с этим:

/^((ftp|http|https):\/\/)?www\.([A-z]+)\.([A-z]{2,})/
  • Проверяет одно или ни одного из следующих: ftp: //, http://, или https://
  • Требуется www.
  • Проверяет любое количество допустимых символов.
  • Наконец, он проверяет, что у него есть домен, и этот домен содержит не менее 2 символов.

Очевидно, что он не идеален, но он хорошо справился с моими делами

3 голосов
/ 02 мая 2013
<html>
<head>
<title>URL</title>
<script type="text/javascript">
    function validate() {
        var url = document.getElementById("url").value;
        var pattern = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
        if (pattern.test(url)) {
            alert("Url is valid");
            return true;
        } 
            alert("Url is not valid!");
            return false;

    }
</script>

</head>
<body>
URL :
<input type="text" name="url" id="url" />
<input type="submit" value="Check" onclick="validate();" />
</body>
</html>
1 голос
/ 06 ноября 2017

Попробуйте это у меня работает:

 /^(http[s]?:\/\/){0,1}(w{3,3}\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/;
1 голос
/ 30 мая 2016
/(?:http[s]?\/\/)?(?:[\w\-]+(?::[\w\-]+)?@)?(?:[\w\-]+\.)+(?:[a-z]{2,4})(?::[0-9]+)?(?:\/[\w\-\.%]+)*(?:\?(?:[\w\-\.%]+=[\w\-\.%!]+&?)+)?(#\w+\-\.%!)?/
1 голос
/ 24 февраля 2016

попробуйте с этим:

 var RegExp =/^(?:(?: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;
1 голос
/ 07 августа 2015

Я использую регулярное выражение / ^ [a-z] +: [^:] + $ / i для проверки URL. Посмотрите пример моего кросс-браузерного InputKeyFilter кода с проверкой URL.

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Input Key Filter Test</title>
	<meta name="author" content="Andrej Hristoliubov anhr@mail.ru">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	
	<!-- For compatibility of IE browser with audio element in the beep() function.
	https://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible -->
	<meta http-equiv="X-UA-Compatible" content="IE=9"/>
	
	<link rel="stylesheet" href="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.css" type="text/css">		
	<script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/Common.js"></script>
	<script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.js"></script>
	
</head>
<body>
URL: 
<input type="url" id="Url" value=":"/>
<script>
	CreateUrlFilter("Url", function(event){//onChange event
			inputKeyFilter.RemoveMyTooltip();
			var elementNewInteger = document.getElementById("NewUrl");
			elementNewInteger.innerHTML = this.value;
		}
		
		//onblur event. Use this function if you want set focus to the input element again if input value is NaN. (empty or invalid)
		, function(event){ this.ikf.customFilter(this); }
	);
</script>
 New URL: <span id="NewUrl"></span>

</body>
</html>

Также см. Мою страницу пример фильтра клавиш ввода .

1 голос
/ 11 сентября 2009

Попробуйте это регулярное выражение , у меня это работает:

function isUrl(s) {
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
    return regexp.test(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...