【问题标题】:Javascript url validation allowing relative and absolute urlsJavascript url 验证允许相对和绝对 url
【发布时间】:2013-05-15 15:18:52
【问题描述】:

我正在尝试验证一个字段以允许相对和绝对网址。我正在使用来自 this post 的正则表达式,但它允许 url 中有空格。

var urlRegex = new RegExp(/(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)/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

下面的代码是我最初用来验证绝对网址的代码,它运行良好。如果我没记错的话,我是从 jquery 源中提取的。如果可以将其修改为也接受相对 url,那将是完美的,但这超出了我的范围。

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);

【问题讨论】:

  • 在这些示例中,您根本不需要调用 RegExp 构造函数。
  • 你是说我可以这样做...var urlRegex = /.../; 对吗?
  • 是的 - 等一下,我想我有答案了。

标签: javascript regex url-validation


【解决方案1】:

我认为您只需要锚定模式,使其必须匹配整个字符串:

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

前导 ^ 和尾随 $ 意味着该模式必须匹配整个字符串,而不仅仅是它的一部分。

edit 表示,该模式还有其他问题。首先,& (&) 的那些 HTML 实体需要只是“&”。 [] 组中的斜线不需要转义,我们不需要“g”后缀。这给我们留下了:

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

再次编辑 - 哎呀还需要包装整个东西。

【讨论】:

  • 我已经更新了模式。使用正则表达式解析 URL 有点棘手。
  • 感谢 Pointy,快到了。它不允许/another/url.aspx,但它允许another/urls.aspx 以及绝对网址。感谢您的回答,非常感谢您的帮助。
  • 嗯,我认为问题在于分组有点偏离。 “/another/url.aspx”部分不起作用,因为正则表达式的左侧部分不允许“.aspx”,而右侧则允许。但是,右侧不允许前导斜杠。我认为我们需要的是匹配协议和主机的右侧部分,然后使整个组在第一个“/”之前是可选的,然后 that 整个组可以是可选的也是(对于“foo/bar.aspx”)。
【解决方案2】:

我写了一篇关于 URI 验证的文章,其中包含 RFC3986 在这里定义的所有各种 URI 组件的代码 sn-ps:

Regular Expression URI Validation

你可以在那里找到你要找的东西。但是请注意,几乎所有字符串都代表一个有效的 URI - 甚至是一个空字符串!

【讨论】:

  • 我正在查看路径正则表达式,但我无法让它在 javascript 中按语法工作。 jmrware.com/articles/2009/uri_regexp/URI_regex.html#uri-34
  • @bflemi3 - 双击文章中的正则表达式,会弹出一个包含格式正确的代码 sn-p 的文本框。您可以通过下拉菜单选择 Javascript 语法。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2011-01-01
相关资源
最近更新 更多