模式匹配
内容脚本可以作用到模式匹配定义好的URL集合上。你能对manifest文件的内容脚本段的部分进行一个或多个模式匹配操作。这里描述模式匹配语法 — 当你指定内容脚本将影响哪些URL时你需要遵循的规则。
任意一个模式匹配本质上都是一个以认可的协议(例如:http、https、file、ftp 或者 chrome-extension)开头的URL,只是URL你可以包含"*"字符。这里有一种特殊的模式匹配
- 协议(scheme)— 例如:http、file或者*
注意: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 协议的URL |
http://www.google.com/ http://example.org/foo/bar.html |
http://*/foo* |
匹配任何使用http 协议的任何域名下,只要以/foo 开头的URL |
http://example.com/foo/bar.html http://www.google.com/foo |
https://*.google.com/foo*bar |
匹配任何使用https 协议的google.com域名或其下子域名(例如 www.google.com,docs.google.com,或者 google.com),只要路径是以/foo 开头,以bar 结尾的URL |
http://www.google.com/foo/baz/bar http://docs.google.com/foobar |
http://example.org/foo/bar.html |
匹配指定的URL | http://example.org/foo/bar.html |
file:///foo* |
匹配以/foo 开头的任意本地文件 |
file:///foo/bar.html file:///foo |
http://127.0.0.1/* |
匹配任意以http 协议的主机ip是127.0.0.1的URL |
http://127.0.0.1/ http://127.0.0.1/foo/bar.html |
*://mail.google.com/* |
匹配任意以http://mail.google.com 或者https://mail.google.com 开头的URL |
http://mail.google.com/foo/baz/bar https://mail.google.com/foobar |
chrome-extension://*/* |
匹配任何指向扩展的URL(第一个 * 表示扩展的ID,第二个表示路径) |
chrome-extension://askla...asdf/options.html |
|
匹配所有认可的协议的URL(参看这一段开头的认可协议列表,里边包含了所有认可的协议) | http://example.org/foo/bar.html file:///bar/baz.html |
这里展示一些不合法的模式匹配的例子:
错误的模式匹配 | 错误原因 |
---|---|
http://www.google.com |
没有说明路径 |
http://*foo/bar |
在域名部分使用'*'时,'*'后边只能是'.' 或者 '/' |
http://foo.*.bar/baz |
如果'*'出现在host部分时, '*'只能出现在开头 |
http:/bar |
少写了协议分隔符("/" 应该是"//") |
foo://* |
无效的协议 |