使用部分捕获进行 url 验证的正则表达式

标签 regex validation url

是否可以使用单个正则表达式来验证 url 并匹配所有部分,我一直在研究一个,到目前为止我想出的是:

(?:(?P<scheme>[a-z]*?)://)?(?:(?P<username>.*?):?(?P<password>.*?)?@)?(?P<hostname>.*?)/(?:(?:(?P<path>.*?)\?)?(?P<file>.*?\.[a-z]{1,6})?(?:(?:(?P<query>.*?)#?)?(?P<fragment>.*?)?)?)?

但是这不起作用,它应该匹配以下所有示例:

http://username:password@hostname.tld/path?arg=value#anchor
http://www.domain.com/
http://www.doamin.co.uk/
http://www.yahoo.com/
http://www.google.au/
https://username:password@domain.com/
ftp://user:password@domain.com/path/
https://www.blah1.subdoamin.doamin.tld/
domain.tld/#anchor
doamin.tld/?query=123
domain.co.uk/
domain.tld
http://www.domain.tld/index.php?var1=blah
http://www.domain.tld/path/to/index.ext
mailto://user@unkwndesign.com



并为所有组件提供命名捕获:

scheme eg. http https ftp ftps callto mailto and any other one not listed
username
password
hostname including subdomains, domainand tld
path eg /images/profile/
filename eg file.ext
query string eg. ?foo=bar&bar=foo
fragment eg. #anchor



将主机名作为唯一的必填字段。

我们可以假设这是来自一个专门要求 url 的表单,并且不会用于在文本中查找链接。

最佳答案

Can a single regex be used to valdate urls and match all the parts



不。

strager 的正则表达式令人印象深刻,但归根结底,它的可读性、可维护性和可靠性不如仅使用适当的 URI 解析器。它必然拒绝有效的 URI 并接受不是 URI 的字符串,因为格式化 URI 的规则无法在正则表达式中完全表达。

mailto://user@unkwndesign.com



mailto URI 中不应有“//”。在您阅读该方案之前,您无法确定 URI 的其余部分(后-:) 将采用什么格式;许多 URI 方案不符合 credentials@host/path 格式。最好只接受您知道如何解析其 URI 的特定方案。

关于使用部分捕获进行 url 验证的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/441739/

相关文章:

javascript - 重置表单/从 jQuery 验证中删除错误类

ios - 如何在 iPhone 上验证 url

java - 替换大括号内的所有内容?

c# - ASP.NET MVC 6 中的属性路由正则表达式约束错误

javascript - jQuery 验证和占位符冲突

javascript - 防止直接操作html5输入数字字段

Android:从 URL 获取 Drawable 不适用于 .jpg,仅适用于 .png

Java 正则表达式 : How detect a URL with file extension

python - 使用 Python 正则表达式处理 Unicode 字符

c++ - RE2 语法 : skip matching if don't share the same prefix