# 模式匹配
[内容脚本](content_scripts.html)可以作用到模式匹配定义好的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协议的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 |
| <all_urls></all_urls> | 匹配所有认可的协议的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://* | 无效的_协议_ |
- 基础文档
- 综述
- 调试
- 格式:Manifest文件
- 模式匹配
- 改变浏览器外观
- Browser Actions
- Context Menus
- 桌面通知
- Omnibox
- Override替代页
- Page Actions
- 主题
- 与浏览器交互
- 书签
- Cookies
- chrome.devtools.* APIs
- Events
- chrome.history
- Management
- 标签
- 视窗
- 实现扩展
- 无障碍性(a11y)
- 背景页
- Content Scripts
- 跨域 XMLHttpRequest 请求
- 国际化 (i18n)
- 消息传递
- Optional Permissions
- NPAPI 插件
- 完成并发布应用
- 自动升级
- 托管
- 打包
- 规范和协议
- 应用设计规范
- 开发人员协议
- 免责声明