2013-05-15 44 views
1

我想验证一个域允许相对和绝对的URL。我使用this post的正则表达式,但它允许在URL中使用空格。Javascript网址验证允许相对和绝对的URL

var urlRegex = new RegExp(/(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\[email protected]?^=%&\/~+#-])?)/gi); 

例子:

// this should work 
this/will/work.aspx?say=hello 
http://www.example.com/this/will/work.aspx?say=hello 

// this shouldn't work but does 
and/this will also work/even though it shouldn't 
and/this-shouldn't/but it does/also 

下面的代码是什么,我最初使用验证只是绝对URL,它是完美的工作。如果我没有记错的话,我把它从jquery源代码中提取出来。如果这可以修改,以接受相当的网址,这将是完美的,但这是超出我的联盟。

var urlRegex = new RegExp(/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i); 
+0

在这些示例中,您无需完全调用RegExp构造函数。 – Pointy

+0

你在说我可以这样做...... var urlRegex = /.../;'对吗? – bflemi3

+0

是的 - 坚持我想我有一个答案。 – Pointy

回答

0

我写的URI验证完整的代码段为所有不同URI组件的文章RFC3986这里定义为:

Regular Expression URI Validation

你可能会发现你在找什么在那里。但请注意,几乎任何字符串都表示一个有效的URI - 即使是一个空字符串!

+0

我正在查看路径正则表达式,但我无法在javascript中使用语法工作。 http://jmrware.com/articles/2009/uri_regexp/URI_regex.html#uri-34 – bflemi3

+0

@ bflemi3 - 双击文章中的正则表达式,弹出包含格式正确的代码片段的文本框。您可以通过下拉菜单选择JavaScript语法。干杯。 – ridgerunner

+0

不错,谢谢ridgerunner – bflemi3

1

我想你只需要以固定的模式,使其具有对整个字符串匹配:

var urlRegex = /^(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\[email protected]?^=%&\/~+#-])?)$/gi; 

领先^和尾随$意味着模式必须将整个字符串,而不是匹配只是其中的一部分。

编辑表示,该模式有其他问题。首先,&&)的HTML实体只需要“&”。在[]组中不需要跳过斜线,我们不需要“g”后缀。这使得我们有:再次

var urlRegex = /^(?:(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)*([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?))$/i; 

编辑 - 也哎呀需要包装整个事情。

+0

nope,仍然允许空格 – bflemi3

+0

我更新了模式。使用正则表达式解析URL是非常棘手的。 – Pointy

+0

谢谢Pointy,它几乎在那里。它不会允许'/ another/url.aspx',但它将允许'another/urls.aspx'以及绝对URL。感谢您的回答,我非常感谢您的帮助。 – bflemi3