2012-03-10 26 views
0

プログラミング言語のリストにjQuery Tokeninputオートコンプリートプラグインを使用していますが、「C++」で「+」文字を処理しないことがわかりました.JavaScriptエラーが返され、オートコンプリートリストには何も表示されません。jQueryプラグインでこのようなRegExpバグを修正するにはどうすればよいですか?

私は "C" を入力すると、IRがエラーを返します:

Uncaught SyntaxError: Invalid regular expression: /(?![^&;]+;)(?!<[^<>])(C++)(?![^<>]>)(?![^&;]+;)/: Nothing to repeat

問題がa small method with RegExp statementであるように思わ:

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

+は正規表現の特別な修飾語で、「1つ以上前のものと一致する」ことを意味します。ただ、その関数のスプライスとstrposバージョンでその関数regexpを交換

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

var re = new RegExp(escapeRegex('[.*?]')); 
+0

は、任意の文字列を正規表現セーフになるだろう任意の方法は、ありますか?例:( "+ regexp_safe(value)+") – krn

+0

それを見つけました:http://simonwillison.net/2006/Jan/20/escape/#p-6 - 今はうまくいきます。ありがとうございました。 – krn

+0

リンクが死んでいると、ここに投稿するのが良いでしょう... – Apolo

-1

:リテラル'+'文字照合するには、すべての特殊文字をエスケープするには\

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

でエスケープ。 それはより速く、より速く働きます、それはどんな特殊文字にも問題を持ちません。ここ

は関数である。

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; 
    } 
} 
+0

OPが望んでいたものではありません。 – Magisch

+0

私は本当に私の答えが有効でない理由を理解することはできません... OPは問題を解決したい...その特定のプラグインに関連して...最初と最も投票された答えは正しく動作しません!プラグインが検索されたテキストを強調表示するのを止めて...私の解決策はより良いです....私は本当に理由がないので、ひどくて困っているのを理解していません。このプラグインを修正する方法はありますか?それとも、正規表現の哲学についてですか?あなたはまだ私の答えが有効ではないと思うなら、助けを求める何か他の分を無駄にすることを避けてください..........! –

0
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) 
); 

}

関連する問題