【发布时间】:2015-12-31 14:26:13
【问题描述】:
我目前正在开发一个 Safari 扩展程序,它将利用 Safari 9 中提供的新 webkit-content-blocker 功能。现在,此类阻止程序的规则需要用 JSON 编写。
我即将推出的扩展程序的后台脚本会生成这样的 JSON 规则。我遇到的问题是我无法正确格式化正则表达式,其作用是过滤 URL,使其与 JSON 兼容。
假设我需要阻止 URL 包含“香蕉”、“橙色”或“苹果”的所有图像。我的正则表达式是这样的:
var url-filter = /banana|orange|apple/g;
现在是 JSON 中的拦截器规则,缺少 url 过滤部分:
"action": {
"type": "block"
},
"trigger": {
"url-filter": <JSON regex here>,
"resource-type": ["image"],
"load-type": ["third-party"]
}
[更新]
在知道不支持交替的情况下,如何将我的正则表达式重写为 JSON 兼容/就绪?
正则表达式格式
触发器支持基于正则表达式过滤每个资源的 URL。
支持以下功能:
- 用“.”匹配任何字符。
- 使用范围语法 [a-b] 匹配范围。
- 用“?”、“+”和“*”量化表达式。
- 带括号的组。
可以使用行首 (“^”) 和行尾 (“$”) 标记,但它们仅限于表达式的第一个和最后一个字符。例如,像“^bar$”这样的模式是完全有效的,而“(foo)?^bar$”会导致语法错误。
[更新的 BIS]
鉴于 Safari 实施了严格的 CSP 政策,并且缺乏对交替的支持,我最终将我原来的正则表达式转换为一个数组,然后通过循环动态生成 JSON 规则。
var regex = 'banana|orange|apple',
filters = regex.split('|'),
json_rules = [];
var Blocker = {
build: function() {
filters.forEach( function(filter) {
var rule = {
action: {
'type': 'block'
},
trigger: {
'url-filter': filter,
'resource-type': ['image'],
'load-type': ['third-party']
}
};
json_rules.push(rule);
});
Blocker.set(JSON.stringify(json_rules));
},
init: function() {
Blocker.build();
},
set: function (rule) {
safari.extension.setContentBlocker(rule);
}
};
【问题讨论】:
-
将正则表达式添加为 JSON 中的 string,并在
new RegExp(str, 'g')中使用此字符串,而且我假设您总是想使用全局标志,所以不需要在 JSON 字符串中使用 -
JSON 不能包含正则表达式。因此,他们需要将它们作为字符串保存,因为这个特定的 API 也需要。
-
很简单...使用 regexp.toString() 然后 eval 转换回来 ;) 不支持的只是检查里面的字符...
标签: javascript json regex safari-extension