带有通配符的 URL 的正则表达式 [duplicate]

regex for url with wildcards [duplicate]

提问人:unice 提问时间:11/14/2023 更新时间:11/14/2023 访问量:63

问:

我不擅长创建正则表达式。我正在尝试使用通配符为URL检查创建正则表达式。这是我尝试过的。

"!^[-a-zA-Z0-9@:%._\+~#=*]{1,256}\.[{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)!

它匹配,但它也匹配,这不是一个有效的 url。我还希望它不要将 url 与子目录匹配,例如*.example.com.example.comwww.example.com/blogs

PHP 正则表达式 URL

评论

0赞 CBroe 11/14/2023
你真的需要在这里重新发明轮子吗?,与 一起使用,已存在。FILTER_VALIDATE_URLfilter_var()

答:

0赞 MikO 11/14/2023 #1

推理

由于您的正则表达式不包含 ,我必须假设您要验证域,而不是 URL。https?:\/\/

如果我理解正确,您希望明确允许作为域部分的通配符。*

一个域由一个或多个部分构成,这些部分可以包含 1 到 62 次(它实际上被指定为“beween two 和 63”,但它们例外,即 x.com),而连字符 (- 不能位于部分的开头或结尾,后跟顶级域 (TLD)。[a-z0-9-]

正则表达式中的所有其他字符(如 @%_ 等)在 URL 的域部分中无效。由于您特别不想处理查询参数,因此我将它们全部从我的表达式中剔除。(使用通配符 tbh 进行部署时,username:password@ 的 HTTP 基本身份验证模式也没有意义)

顶级域名可以使用有效 TLD 列表进行验证,但这超出了您的问题范围。


溶液

因此,我想出的解决您的问题的正则表达式非常简单:

^(([a-z0-9]([a-z0-9-]{0,60}[a-z0-9])|\*)\.)+[a-z]{2,}$

如需深入解释,请将此表达式插入 https://regex101.com 中,因为我不会从这里复制整个解释。

它基本上做了我进一步解释的内容,但允许代替域部分。*

对于 TLD 部分,我刚刚指定,它只是字母和至少两个字符长,因为这适合我知道存在的所有 TLD。

此外,您应该检查总长度不超过 253 个字符,但在正则表达式之外这样做更容易(且性能更高)。

您可以在 RFC2181 中找到所有这些规范。