Как исправить такую ​​ошибку RegExp в плагине jQuery? - PullRequest
0 голосов
/ 10 марта 2012

Я использую jQuery Tokeninput плагин автозаполнения для списка языков программирования, и я обнаружил, что он не обрабатывает символ "+" в "C ++": он возвращает ошибку JavaScript и ничегопоявляется в списке автозаполнения.

При вводе "C" ir возвращает ошибку:

Uncaught SyntaxError: Недопустимое регулярное выражение: / (?! [^ &;] +;)(?! <[^ <>] ) (C ++) (?! [^ <>] >) (?! [^ &;] +;) /: Ничего повторять

Кажется, проблема в небольшом методе с оператором RegExp :

function find_value_and_highlight_term(template, value, term) {
    return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + value + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
}

Переменные:

template = "<li>C++</li>";
value = "C++";
term = "C";

Как это исправить?

Ответы [ 3 ]

3 голосов
/ 10 марта 2012

+ - это специальный модификатор в регулярных выражениях, который означает «соответствовать одному или нескольким предыдущим».Чтобы сопоставить буквенный символ '+', экранируйте его с помощью \

/(?![^&;]+;)(?!<[^<>])(C\+\+)(?![^<>]>)(?![^&;]+;)/

Чтобы экранировать все специальные символы:

function escapeRegex(str) {
  return str.replace(/[-\/\\$\^*+?.()|\[\]{}]/g, '\\$&');
}

var re = new RegExp(escapeRegex('[.*?]'));
0 голосов
/ 06 июля 2016
Here I have found solution of "c++" string during searching in tokeninput js.
you just search code in jquery.tokeninput.js and replace with code below.

here are the function:

 function regexSanitize( str ) {
   return str.replace(/([.+*?:\[\](){}|\\])/g, "\\$1");
  }

  function highlight_term(value, term) {
    return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + regexSanitize(value) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
    }



 function find_value_and_highlight_term(template, value, term) {
       return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + regexSanitize(value) + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term)
);

}

0 голосов
/ 04 марта 2016

Просто замените эту функцию регулярного выражения на версию сращивания и strpos этой функции. Он работает лучше и быстрее, не будет проблем с какими-либо специальными символами.

вот функция:

function find_value_and_highlight_term(template, value, term) {
  var templateLc = template.toLowerCase();
  var strpos = templateLc.indexOf(term);
  if(strpos) {
    var strlen = term.length;
    var templateStart = template.slice(0,strpos);
    var templateEnd = template.slice(strpos+strlen);
    return templateStart+"<b>"+term+"</b>"+templateEnd;
  } else {
    return template;
  }
}
...