将JavaScript RegEx转换为JSON格式

时间:2015-10-03 13:18:49

标签: javascript json regex safari-extension

我目前正在开发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);
        }

};

1 个答案:

答案 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