1. 不能接受当处理成链接时存在安全风险的字符串。例如,
<a href="javascript:alert(document.cookie)">clickme</a>
是一个有效的HTML元素,并且至少在某些浏览器中确实起作用(引发警报等)。我担心如果我允许任意方案(见下文),它可能会危及安全性(如此处所述:What is the best regular expression to check if a string is a valid URL?)。2. 必须在JavaScript中正确工作。
3. 如果可以在Java中使用相同的代码就更好了——我正在开发GWT,这非常好但不是必需的。
4. 必须接受实际使用的URL,而不仅仅是符合标准的URL。具体例子包括:
a. 我希望接受http://fr.wikipedia.org/wiki/Français,这是非标准的,因为它包含了非英文字符,但是我的参考浏览器IE(7+)和Chrome接受它。
b. 我希望接受http://fr.wikipedia.org/wiki/Fran%c3%a7ais,这是非标准的,因为百分号编码应该是大写的,但是IE和Chrome也接受它。我想我可以进行大小写不敏感匹配——你能想到什么缺点吗?
c. 我希望接受http://localhost/localpath/servlet#action?param=value,这是非标准的,因为片段部分(从“#”到结尾)不应包括“?”和其他字符,但有些应用程序生成这样的URL并且浏览器接受它们。
d. 我希望接受具有任何协议/方案(不仅仅是http、https和ftp)的URL,因为我整合的各种应用程序及其用户可能需要传递此类URL。我可以禁止“javascript:”,并允许其他所有内容;如果您认为这会危及安全,请告诉我。
在SO和其他地方有很多关于这个主题的问题,但我没有找到一个正则表达式符合我所有的要求。例如:
GWT中用来匹配URL的正则表达式 -- 这是一个相当不错且简单的正则表达式,但是不能接受非标准的URL。我可以处理方案部分和百分号编码的大小写敏感性,但是无法解决其他问题。
https://dev59.com/NHVC5IYBdhLWcg3w21Iq#190405 -- 一个庞大的正则表达式(我自己都在想我使用的所有浏览器和框架是否都能处理这个大小),它似乎非常全面,但是声明符合标准,我却看不懂。
谢谢!:-)