浏览器用于HTML5输入类型= url的正则表达式是什么?

时间:2012-05-16 20:34:35

标签: regex html5 validation url input

我正在处理HTML5输入模式polyfill,我正在尝试在JavaScript中验证输入类型= url,就像浏览器(Chrome)一样,但无法找到有关JavaScript或PERL兼容正则表达式的任何文档。因为它是一个polyfill,我不特别介意它是否完全匹配所有URL(这是不可能的),而是它模仿浏览器的工作方式。

有人会在PERL语法中知道相同的模式吗?

由于

2 个答案:

答案 0 :(得分:4)

在GitHub上搜索了几个HTML5 shiv后,看看是否有其他人遇到了理想的表达方式,我相信我找到的东西非常接近,但它并不完全匹配。

Alexander Farkas(https://github.com/aFarkas/webshim/blob/master/src/shims/form-shim-extend.js#L285)使用此模式测试网址:

/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\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])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\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})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([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})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([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;

另外,对于那些通过Google偶然发现这种情况的人来说,如果你不需要这种模式,但只想通过JavaScript检查某些内容是否有效(也许是onChange),你可以使用formelement.checkValidity()方法。显然这对polyfill没有帮助(假定没有原生的HTML5验证支持),但它仍然有用。

答案 1 :(得分:3)

阅读http://www.w3.org/TR/html5/forms.html#url-state-(type=url)处的相关规范:

您的polyfill应首先清理输入,即删除换行符并修剪字符串。句子“用户代理不得允许用户插入”LF“(U + 000A)或”CR“(U + 000D)字符”也可能很有趣。

结果应为validabsolute网址。引用的RFC 39863987将描述网址验证,有关{​​{3}}的部分可能也很有趣。

您的polyfill不仅可以验证URI,还可以parsing URLs。至少,使用algortihm验证URI会更简单,而不是找到合适的正则表达式。然而,甚至RFC也提到了在resolve relative URIs中解析已经验证的 URI的正则表达式。