我目前正在开发Safari扩展程序,它将使用Safari 9中提供的新webkit-content-blocker功能。现在,此类阻止程序的规则需要使用JSON编写。
我即将推出的扩展程序的后台脚本生成了这样的JSON规则。我遇到的问题是我无法正确格式化正则数据库,其角色是过滤URL,与JSON兼容。
假设我需要阻止其网址包含" banana"," orange"或" apple"的所有图片。我的正则表达式是这样的:
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);
}
};
答案 0 :(得分:2)
根据您链接的文档,过滤器的值被视为正则表达式(例如,它们显示为"url-filter": "evil-tracker\\.js"
和"url-filter": ".*"
)。
文档还说url-filter
不区分大小写,因此您不必担心您可能想要使用的i
标记。但如果你想要一个区分大小写的,你可以添加"url-filter-is-case-sensitive": true
。
在这种情况下,你只需将正则表达式放在引号中,确保转义任何需要在字符串文字中转义的字符(例如,注意它们如何在"evil-tracker\\.js"
字符串中使用两个反斜杠,为了使正则表达式为evil-tracker\.js
)。
然而:您的表达问题是他们不支持替换。再次,从您链接的文档:
格式是JavaScript正则表达式的严格子集。从语法上讲,JavaScript支持的所有内容都是保留的,但解析器只接受一个子集。不受支持的表达式会导致解析错误。
支持以下功能:
- 将任何字符与“。”匹配。
- 使用范围语法[a-b]匹配范围。
- 使用“?”,“+”和“*”来量化表达式。
- 带括号的组。
可以使用行的开头(“^”)和行尾(“$”)标记,但它们被限制为表达式的第一个和最后一个字符。例如,像“^ bar $”这样的模式是完全有效的,而“(foo)?^ bar $”会导致语法错误。
请注意,他们不接受|
(更改)。
这告诉我你需要三个规则:一个用于banana
,一个用于orange
,一个用于apple
。