2016-02-22 3 views
0

Я разрабатываю надстройка контекстного меню для Firefox. Я пытаюсь получить selectedText и проверить, является ли это числом. Если это число, я использую это числовое значение для дальнейшей обработки.Картинка Regex в контекстном меню Firefox contentScript

Но, я застрял в точке, где я пытаюсь заменить [(,)], используя 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

После многих проб и ошибок нашел проблему. Когда мы пытаемся избежать символа внутри одной кавычки, нам нужно добавить еще один escape-код для escape-символа для распознавания, иначе одиночный побег \] будет считаться ], что приводит к резкому завершению шаблона регулярных выражений.

В этом случае:

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

декодируется как:

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

вместо как:

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

Итак, добавляя еще один экранирующий символ для символа побега разрешен шаблон правильно:

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

Извините, что потратил время на анализ причины, если таковой имеется.

 Смежные вопросы

  • Нет связанных вопросов^_^