如何编写可拒绝连续双斜杠、仅接受斜杠间含内容的正则表达式
正则问题解答
原有写法问题说明
你当前的两种正则写法都不符合需求,核心问题是没有限制每个斜杠后面必须紧跟至少一个非斜杠的合法路径字符,所以会出现两类问题:
- 调整后的正则
(/[a-zA-Z0-9.]+[a-zA-Z0-9./]+)要求每段匹配内容的斜杠后必须先跟至少一个非斜杠字符,因此路径末尾的单独斜杠无法被匹配 - 如果直接放宽规则允许斜杠连续出现,又会导致附录A里的双斜杠非法输入被放行
符合要求的正则方案
完整URI匹配正则
^https?:\/\/[a-zA-Z0-9.-]+(?:\/[a-zA-Z0-9._-]+)*\/?(?:#.*)?$
仅路径部分匹配正则(不含域名、哈希片段)
(?:\/[a-zA-Z0-9._-]+)*\/?
如果你需要提取路径段的分组,把非捕获组
(?:)换成普通括号()即可。
效果验证
附录A非法输入拦截
- 输入
//www.example.com:缺少http/https协议头,匹配失败,成功拦截 - 输入
http://www.example.com//:域名后出现连续双斜杠,不符合「每个斜杠后必须跟非斜杠字符」的规则,匹配失败,成功拦截
附录B合法输入匹配
输入http://www.ics.uci.edu/pub/ietf/uri/#Related:
- 协议头、域名部分正常匹配
- 路径
/pub/ietf/uri匹配(?:\/[a-zA-Z0-9._-]+)*规则 - 末尾的单个
/匹配\/?规则 - 末尾的
#Related哈希片段匹配(?:#.*)?规则
整体完全匹配,符合需求。
自定义调整说明
你可以根据实际业务需求调整方括号[]内允许的路径字符范围,比如需要支持百分号编码、特殊字符的话,直接把对应字符加到方括号里即可,只要保证不把/放到紧跟在斜杠后的那部分规则里,就不会出现连续斜杠被放行的问题。
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

