JavaScript中用于URL验证的正则表达式

38

是否有一个用于验证URL(而不是在文本中查找它们)的正则表达式?最好使用JavaScript代码片段。

18个回答

91

被采纳的答案中,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

语法参考资料:


8
@DerekHenderson,你看这里,你那个反感W3Schools的人 ;) - Akseli Palén
39
对于不必要的-1点评,给予+1点赞,对于W3Schools的仇恨,不必要进行攻击。 - MaxArt
3
这段代码无法适用于许多URL。在检测URL时,最好依赖于专门的库。这就是为什么 - Dan Dascalescu
var r = new RegExp(/^(ftp|http|https)://[^ "]+$/); 当使用new时,参数不需要'....',只需使用/^(ftp|http|https)://[^ "]+$/,就像我的尝试一样。 - Fanl
同时加一分,因为不必要的W3Schools仇恨而减一分。 - Yuriy Yakovenko
显示剩余2条评论

38

实际的URL语法非常复杂,不易用正则表达式表示。大多数看起来简单的正则表达式将产生许多错误的结果,包括假负和假正匹配。你可以查看这些例子以获得乐趣,但即使最终结果也不是很好。

此外,现在您通常需要允许IRI和旧版URI,以便链接到有效的地址,例如:

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

我只会进行简单的检查:它是否以一个已知的良好方法(名称)开头?它是否不包含空格和双引号?如果是,那么它可能足够好了。


4
好的,至少现在我知道在大多数情况下这可能不值得努力 :] 谢谢。 - Marek Stój
4
这是一个正则表达式,用于匹配以"ftp://"或"https://"开头且后面紧跟着非空格字符的字符串。 - Tim Lovell-Smith
1
事实上,验证URL的正确方法并不是使用正则表达式。请查看Node.js中的URI验证代码(https://github.com/joyent/node/blob/master/lib/url.js)。它比一个正则表达式要复杂得多,这就是为什么最好使用专门的库而不是自己编写正则表达式的原因。 - Dan Dascalescu
还有两件事需要考虑:1)tel:,mailto:,sms: 都是有效的主机;2)移动浏览器(尤其是iOS)允许使用http/https/ftp以外的其他方式进行应用程序间通信。 - eliajf

28

尝试使用这个正则表达式

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

对我来说,它运行得最好。


2
我认为这是用于URL验证的最佳正则表达式。 - Musaddiq Khan
1
这段代码无法适用于许多URL。在检测URL时,最好依赖于专门的库。这就是为什么 - Dan Dascalescu
整洁,一次就成功! - undefined
没问题,对我来说可以的,谢谢你。 - undefined

7

我在这方面取得了一些成功:

/^((ftp|http|https):\/\/)?www\.([A-z]+)\.([A-z]{2,})/
  • 它检查以下内容之一或没有: ftp://、http:// 或 https://
  • 它需要 www。
  • 它检查任意数量的有效字符。
  • 最后,它检查是否有一个域名且该域名至少为 2 个字符。

显然它并不完美,但它处理我的情况还是相当不错的。


1
需要www就像"顶级域名必须是.com"一样。不要这样做。 - foo

6

4
你可以在input中使用type="url",然后在js中使用checkValidity()进行检查。
例如:

your.html

<input id="foo" type="url">

your.js

$("#foo").on("keyup", function() {
    if (this.checkValidity()) {
        // The url is valid
    } else {
        // The url is invalid
    }
});

顺便提一下,我已经意识到值得注意的是,您还应该在服务器端进行某种验证以避免注入攻击,因为此解决方案是100%客户端。 - Daniel Rodríguez

3

经过长时间的研究,我制定了这个正则表达式。我希望它能帮助其他人......

url = 'https://google.co.in';
var re = /[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/;
if (!re.test(url)) { 
 alert("url error");
return false;
}else{
alert('success')
}

3
<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>

这段代码无法适用于许多URL。在验证URL时,最好依赖于专门的库。这就是为什么 - Dan Dascalescu
如果您想自定义模式,则使用纯JavaScript进行验证是更好的选择,您可以轻松地在模式中实现这一点。 - Swapnil

2

我找不到一个能够满足我的需求的翻译工具。这篇文章是在https://gist.github.com/geoffreyrobichaux/0a7774b424703b6c0fffad309ab0ad0a上编写和发布的。

function validURL(s) {
    var regexp = /^(ftp|http|https|chrome|:\/\/|\.|@){2,}(localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\S*:\w*@)*([a-zA-Z]|(\d{1,3}|\.){7}){1,}(\w|\.{2,}|\.[a-zA-Z]{2,3}|\/|\?|&|:\d|@|=|\/|\(.*\)|#|-|%)*$/gum
    return regexp.test(s);
}


2

我试过这个方法,它对我有效:

 /^(http[s]?:\/\/){0,1}(w{3,3}\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接