You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于URL Pattern API路径名匹配规则及通配符使用的技术咨询

关于URL Pattern API路径名匹配规则及通配符使用的技术咨询

嘿,这个问题我刚接触URL Pattern API的时候也踩过坑!咱们一步步把它掰扯清楚:

先给你吃个定心丸:这不是bug,是API特意设计的匹配规则

你测试的这段代码返回true完全符合API的设计逻辑,既不是隐藏特性,也不是你漏看了文档细节:

console.log( new URLPattern({pathname: '*/books'}).test({pathname: '/api/v1/books'}) )

核心原因:URL Pattern API的通配符与路径模式解析逻辑

咱们结合你提到的规范细节来拆解:

  • 你说WHATWG规范要求路径名必须以/开头,这没错,但这是针对实际的URL路径名(比如你传入的/api/v1/books),而不是针对API的匹配模式
  • URL Pattern API的模式语法做了灵活扩展:当你写的路径名模式不以/开头但包含通配符*时,*会被解析为匹配任意数量的连续路径段(包括路径分隔符/
    拿你的例子来说,模式*/books里的*直接匹配了目标路径中的/api/v1部分,后面的/books正好对应目标路径的末尾段,所以整体匹配成功,返回true

不同写法的匹配范围对比(帮你理清边界)

为了让你更清楚,我列几个常见模式的区别:

  • 模式/books:严格匹配仅以/books开头且没有后续段的路径,只会匹配/books,不会匹配/api/v1/books
  • 模式/*/books:匹配包含**单前缀段+/books**的路径,比如/a/books/v2/books,但不匹配/api/v1/books
  • 模式*/books:就是你用的写法,匹配**任意数量前缀段+/books**的路径,比如/api/v1/books/a/b/c/books都能命中

回到你提到的规范细节

你说的WHATWG里「canonicalize a pathname」要求路径名以/开头、路径名选项的delimiter和prefix设为/,这些都是API内部处理路径拆分的规则——它负责把路径拆成/分隔的段,而模式的语法允许用*跨段匹配,两者是互补的逻辑,并不冲突。

简单总结下:你遇到的是API为了提升匹配灵活性设计的常规特性,不是隐藏功能。如果需要更严格的开头匹配,只要给模式加上开头的/并调整通配符位置就可以啦!

火山引擎 最新活动