基本概念-模式匹配

300 阅读2分钟

内容脚本可以作用到模式匹配定义好的URL集合上. 你能对manifest文件的内容脚本段的部分进行一个或多个模式匹配操作. 这里描述模式匹配语法 — 当你指定内容脚本将影响哪些URL时你需要遵循的规则.

任意一个模式匹配本质上都是一个以认可的协议(例如:http, https, file, ftp 或者 chrome-extension)开头的URL,只是URL你可以包含"*"字符. 这里有一种特殊的模式匹配<all_urls>,它表示所有已认可的协议开头的URL都被匹配. 每个模式匹配都由以下三部分构成:</all_urls>

  • 协议(scheme) — 例如,http or file or*

    注意: file协议不是缺省的(访问文件时可能需要明确指明使用file协议). 用户可以访问扩展管理页面或者设置页面来查看每个扩展独立的file协议设置.

  • 域名(host) — 例如,www.google.com或者 .google.com或者; 如果使用file协议, 这里就不需要域名部分

  • 路径(path) — 例如,/ ,/foo, 或者/foo/bar

下边列出了基本语法:

_<url-pattern>_ := _<scheme>_://_<host>__<path>_
_<scheme>_ := '*' | 'http' | 'https' | 'file' | 'ftp' | 'chrome-extension'
_<host>_ := '*' | '*.' _<除 '/''*' 外的其它任意字符>_+
_<path>_ := '/' _<任意字符>_

' '的含意依赖于它是出现在协议*,域名, 或者路径中的那个部分. 如果协议部分是×, 那么它表示匹配以http和https协议开头的URL. 如果域名部分是×, 那么它表示匹配任何域名. 如果域名部分是*.域名, 那么它表示匹配该域名及任何该域名下的子域名. 而在路径部分,每个'*'表示0个或多个字符. 下面的表展示了一些合法的模式匹配.

模式匹配含意能够匹配上的URL例子
http:///匹配任何http协议的URLwww.google.com/ example.org/foo/bar.htm…
http:///foo匹配任何使用http协议的任何域名下,只要以/foo开头的URLexample.com/foo/bar.htm… www.google.com/foo
https://.google.com/foobar匹配任何使用https协议的google.com域名或其下子域名(例如 www.google.com, docs.google.com, 或者 google.com), 只要路径是以/foo开头,以bar结尾的URLwww.google.com/foo/baz/bar docs.google.com/foobar
example.org/foo/bar.htm…匹配指定的URLexample.org/foo/bar.htm…
file:///foo*匹配以/foo开头的任意本地文件file:///foo/bar.html file:///foo
http://127.0.0.1/*匹配任意以http协议的主机ip是127.0.0.1的URLhttp://127.0.0.1/ http://127.0.0.1/foo/bar.html
://mail.google.com/匹配任意以mail.google.com或者https://mail.googl….mail.google.com/foo/baz/bar mail.google.com/foobar
<all_urls></all_urls>匹配所有认可的协议的URL. (参看这一段开头的认可协议列表,里边包含了所有认可的协议.)example.org/foo/bar.htm… file:///bar/baz.html

这里展示一些不合法的模式匹配的例子:

错误的模式匹配错误原因
www.google.com没有说明路径
http://*foo/bar域名部分使用' '时,' '后边只能是'.' 或者 '/'
http://foo.*.bar/baz如果' '出现在host部分时, ' '只能出现在开头
http:/bar少写了协议分隔符("/" 应该是"//")
foo://*无效的协议