我有以下代码,我从另一个SO问题中偷走了
$('#'+'^`test'.replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, "\\\\$&"))
会产生以下错误。
未捕获错误:语法错误,无法识别的表达式:#\\ ^ \\`test(...)
我只有一些带有疯狂角色的ID,比如^和`,我需要jQuery才能阻止它。我不明白为什么会发生错误,因为如果我手动将斜杠添加到字符串中,
$('#'+'\\^\\`test')
然后它工作正常。正则表达式方法有什么问题?
答案 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')