试图转义字符串以用作jQuery选择器

时间:2017-03-06 13:20:11

标签: javascript jquery regex

我有以下代码,我从另一个SO问题中偷走了

$('#'+'^`test'.replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, "\\\\$&"))

会产生以下错误。

  

未捕获错误:语法错误,无法识别的表达式:#\\ ^ \\`test(...)

我只有一些带有疯狂角色的ID,比如^和`,我需要jQuery才能阻止它。我不明白为什么会发生错误,因为如果我手动将斜杠添加到字符串中,

$('#'+'\\^\\`test')

然后它工作正常。正则表达式方法有什么问题?

4 个答案:

答案 0 :(得分:3)

  

我只是有一些带有疯狂字符的ID,比如^和`,我需要jQuery来阻止它。

到目前为止,解决这个问题的最简单方法是使用属性选择器:

$('[id="' + theId + '"]').doSomething();

只要theId不包含反斜杠或双引号,就不需要进一步转义。

答案 1 :(得分:2)

另一种解决方法是使用vanilla getElementById,它不解析选择器。这样你仍然可以通过id选择效率:

let res = $(document.getElementById('^`test'));

答案 2 :(得分:0)

你需要2次逃脱。首先,替换/正则表达式需要逃脱写一个逃脱。下一个转义需要来自jquery的$()。

postet正则表达式的语法更清晰:

"#^bla`".replace('^','\\\^').replace('`','\\\`');

将取代&#34;#^ bla`&#34;到&#34;#\\ ^ bla \\`&#34;。

  

未捕获错误:语法错误,无法识别的表达式:#\\ ^ \\`test(...)

如果你想使用正则表达式,你还必须使用\ [和\]转义[]。

"+".replace(/[!"#$%&'()*+,.'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, "yes")

答案 3 :(得分:0)

如何使用它?

const $ID = function(selector){
    return $('[id="' + selector.match(/#?(\S+)/)[1] + '"]')
}

然后你可以像jquery一样使用它

$ID('#^`div')