正则表达式映射在 Firefox 上下文菜单内容脚本中

Regex mapping in Firefox context menu contentScript

本文关键字:脚本 菜单 上下文 映射 Firefox 正则表达式      更新时间:2023-09-26

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

但是,我陷入了尝试在 javascript replace 方法中使用正则表达式替换[(,)]的地步。

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

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>

经过多次试验和错误发现问题。当我们尝试转义单引号内的字符时,我们需要再添加一个转义字符才能被识别,否则单个转义']将被视为],这会导致正则表达式模式的突然结束。

在这种情况下:

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

被解码为 :

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

而不是作为:

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

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

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

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