如何编写符合指定规则的自定义合法URL正则表达式
正则问题排查与修复方案
原有正则的问题梳理
- 否定前瞻逻辑错误:将
(?!http|https)的位置写得完全错位,还错误加入了:\/\/匹配片段,直接违背「不能以http/https开头」的核心要求 - www前缀匹配逻辑错误:
(www\.?)的写法仅表示www后可以可选带点,没有将整个www.作为可选前缀处理 - 域名主体规则漏洞:未限制中间仅允许出现字母、数字、连字符、点四种字符,也没有避免连字符出现在各级域名的首尾
- 顶级域匹配错误:
[^\s]{2,}会匹配所有非空白字符,包括@、$、_等禁止的特殊字符,也没有限制顶级域必须在字符串结尾,会放过结尾带非法字符的内容
正确正则表达式
/^(?:www\.)?(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,}(?:\.[a-zA-Z]{2,})?$/gi
规则说明
^匹配字符串开头,天然过滤所有以http/https等非域名开头的内容(?:www\.)?非捕获组,匹配可选的www.前缀,满足可带可不带www的要求(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+匹配各级域名主体:每级域名只能以字母数字开头结尾,中间可以带连字符,末尾带点,支持多级域名配置[a-zA-Z]{2,}(?:\.[a-zA-Z]{2,})?匹配顶级域,支持.com、.io这类单段顶级域,也支持.co.in这类双段顶级域$匹配字符串结尾,避免顶级域后出现其他非法字符
验证效果
所有你提供的合法示例均可正常匹配,所有非法示例均会被拦截:带http/https开头的内容会被开头匹配规则直接拦截,带_、@等特殊字符的内容会被域名主体规则拦截,结尾带特殊字符、连字符结尾或者没有合法顶级域的内容会被结尾规则拦截。
内容的提问来源于stack exchange,提问作者Mohit Chandani
相关产品推荐
相关产品推荐

