Firefox上下文菜单contentScript中的正则表达式映射

时间:2016-02-22 07:17:10

标签: javascript regex firefox-addon contextmenu replaceall

我正在为Firefox开发上下文菜单插件。我试图获取selectedText并验证它是否是一个数字。如果是一个数字我正在使用该数字值进一步处理。

但是,当我试图使用regex in javascript replace method替换[(,)]时,我陷入困境。

以下代码无法映射以()开头/结尾的任何数字:

var menuItemLRG = contextMenu.Item({
  label: "LRG",
  data: "http://myurl/&val=:",
  contentScript: 'self.on("click", function (node, data) {' +
                     '  var selectedText = window.getSelection().toString();' +
                     '  var formattedText1 = selectedText.trim();' +
                     '  var formattedText2 = formattedText1.replace(/^[,\[\]()]*/g,"");' +
                     '  var formattedText3 = formattedText2.replace(/[,\[\]()]*$/g,"");' +
                     '  console.log(formattedText3); '+
                     '  var regExp = new RegExp(/^[0-9]+$/);' +
                     '  if (regExp.test(formattedText3) == true) {' +
                     '     console.log("URL to follow :"+data+formattedText3);' +
                     '     window.open(data+formattedText3);' +
                     '  } '+
                 '});'
});

以上代码无法替换示例输入中的()(5663812, 11620033)

但是,如下的香草测试成功:

<script>
var str = "(2342423,])";
var tmpVal1 = str.replace(/^[,\[\]()]*/g,"");
var tmpVal2 = tmpVal1.replace(/[,\[\]()]*$/g,"");
var regExp = new RegExp(/^[0-9]+$/);
if (regExp.test(tmpVal2) == true) {
   alert(tmpVal2);
}
</script>

1 个答案:

答案 0 :(得分:1)

经过多次试错后发现了这个问题。当我们尝试在单引号内转义一个字符时,我们需要为转义字符添加一个转义以获得识别,否则单个转义\]将被视为],这将导致突然结束正则表达式模式。

在这种情况下:

'  var formattedText2 = formattedText1.replace(/^[,\[\]()]*/g,"");'

解码为:

   var formattedText2 = formattedText1.replace(/^[,[]()]*/g,"");

而不是:

  var formattedText2 = formattedText1.replace(/^[,\[\]()]*/g,"");

因此,通过为转义字符添加一个转义字符可以正确解析该模式:

'  var formattedText2 = formattedText1.replace(/^[,\\[\\]()]*/g,"");'

很抱歉浪费时间分析原因,如果有的话。