【发布时间】:2016-10-14 19:34:21
【问题描述】:
/^[_a-z0-9]+(\.[_a-z0-9]+)*[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,7})$/
这就是模式。当它正确时它说“ok”,当它不正确时它说“not ok”。所以它在 www.google.com 上显示“ok”,但当我输入 http://www.google.com 时显示“not ok”
我希望这种模式也允许 http://,但绝不应该是必需的。
【问题讨论】:
/^[_a-z0-9]+(\.[_a-z0-9]+)*[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,7})$/
这就是模式。当它正确时它说“ok”,当它不正确时它说“not ok”。所以它在 www.google.com 上显示“ok”,但当我输入 http://www.google.com 时显示“not ok”
我希望这种模式也允许 http://,但绝不应该是必需的。
【问题讨论】:
您可以使用以下正则表达式,我取消了从Perl module URI on CPAN 的文档中借用(我的斜线转义)。
/(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/
它将为您提供捕获组中 URI 的所有不同部分。
这些部分是:
请参阅https://regex101.com/r/vS5qO1/1 进行试用。
还请注意,这将解析所有类型的 URI,而不仅仅是 http(s)。所以像ftp://anonymous@example.org 这样的东西也可以工作。
【讨论】:
如果您希望仅允许 http/https URL 方案(当提供方案时),则对正则表达式进行以下修改即可:
/^(http:\/\/|https:\/\/)?[_a-z0-9]+(\.[_a-z0-9]+)*[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,7})$/
您可以使用我的答案作为示例,说明如何将 url 方案组添加到您现有的正则表达式中,但要归功于 @simbabque,因为他有一个更完整的答案。
【讨论】: