javascript中URL的正则表达式模式

时间:2013-12-19 06:07:20

标签: javascript regex

我使用以下网址正则表达式进行网址验证。

/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;

但我需要排除.com  即http://google/应该有效。

需要做些什么改变?

3 个答案:

答案 0 :(得分:3)

您最好从jquery.validate.js扩展名中使用此长度表达式。这是经过充分测试并支持多语言网址。 不要害怕表达式中的unicode和十六进制表达。它只支持多语言网址。请参阅this (Unicode Characters)以了解以下unicode意味着什么

/^(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

您的上述表达式有很多缺陷,例如表达式的最后一部分\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?本身与整个网址匹配,并且对前一个表达式没有任何影响

答案 1 :(得分:2)

假设您想要包括没有.com的网址的所有内容。

/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}

(?:\.[a-z]{2,4})? // (?:) match group this is where the .com is captured
                  // ? quantifier 0 to 1 times

\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi

JSFIDDLE

答案 2 :(得分:1)

只需使用此部分:\.[a-z]{2,4}并将其替换为(\.[a-z]{2,4})?

完整的正则表达式:

[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}(\.[a-z]{2,4})?\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?

demo

有效地我们在这里做的是使.xxxx可选,将其包装在()中并使用?表示非贪婪状态。

这将匹配:

http://www.google.com/

http://localhost/

警告:这不是达到你想要的最有效的表达方式,但它只是完成你想要的所需的最小调整。