需要转义 jQuery 选择器字符串中的特殊字符

IT技术 javascript jquery
2021-01-17 15:18:29

根据选择器文档,您必须[使用双反斜杠等进行转义\\[

我有一个像这样创建的选择器(假设val属性something[4][2]在这个例子中)。

var val = $(this).attr('val');           

$select.find('option[value=' +  val + ']').show();

我可以写一个正则表达式来为我转义括号吗?

6个回答

如果你想要一些具有任何value的东西,试试这个:

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

这是通过使用两个反斜杠转义jQuery 文档Selectors 页面上列出的所有 CSS 元字符来实现的

请记住,在您的情况下,没有必要做这样棘手的事情。您可以使用filter函数选择具有给定值的所有选项元素,而不必转义该值,如 Mathias Bynens 的回答中所述。

仅供参考,你的表情不见了@
2021-03-13 15:18:29
替换字符串 "\\\\$&" 不适用于 jQuery 1.10。在这种情况下,它应该是“\\$&”。
2021-03-14 15:18:29
我有这种奇怪的行为:> cs < "#XMTM2NDQwNTI5Mg\\=\\=" = $7 > $(cs) < Error: Syntax error, unrecognized expression: #XMTM2NDQwNTI5Mg\\=\\= > $("#XMTM2NDQwNTI5Mg\\=\\=") < m [<div id="XMTM2NDQwNTI5Mg==">] (1) = $10 然后我使用:replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^{|}~]/g, "\\$&")` 将变量更改为一个转义符,使用变量作为选择器工作。
2021-03-18 15:18:29
在我的情况下不起作用(返回“未捕获的错误:语法错误,无法识别的表达式:测试 \\#”)如果我尝试启动 $(myString)
2021-03-24 15:18:29
我可以发誓@在我写的时候我没有在选择器页面上看到,但我无法找到他们将它添加到存储库中以用于他们的文档的确切时间。无论如何,我即将修复它。
2021-04-10 15:18:29

CSS 字符转义序列(在选择器中使用)很棘手它们非常棘手,我什至制作了一个网络应用程序,可以告诉您如何转义 CSS 中的任何字符

简单地选择所有元素,然后根据它们的属性值选择它们要简单得多效率也更高optionfiltervalue

var value = this.value;
$select.find('option').filter(function() {
  return this.value == value;
}).show();

这样,根本不需要特殊的转义。

迟到了,但是,

jQuery 3

添加缺失""'option[value="'+ val +'"]'

var val = "something[4][2]";

$("select").find('option[value="' +  val  + '"]').show();
option{
  display: none;
}
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>

<select>
  <option value="something[4][2]">4,2</option>
  <option value="something[1][1]">1,1</option>
</select>

jQuery 3 和 jQuery.escapeSelector()

没有包装引号 - 所以使用你原来的选择器 'option[value='+ val +']'

var val = "something[4][2]";           
var eSel = $.escapeSelector( val );    // something\[4\]\[2\]

$("select").find('option[value='+ eSel +']').show();
option{
  display: none;
}
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>

<select>
  <option value="something[4][2]">4,2</option>
  <option value="something[1][1]">1,1</option>
</select>

看一下这个...

var val = $(this).attr('val').replace(/(\[|\])/g, '\\\\$1'); // something\\[4\\]\\[2\\]

当然,这只处理括号,而不处理任何其他特殊字符。然而,在我的经验中,括号中是唯一我使用(因为PHP的处理输入名称的属性这样的简便方法:something[]

在选择器中的属性值周围加上引号,然后你只需要在值中转义反斜杠和引号:

var val = $(this).attr('val');

val = val.replace(/\\/g, "\\\\").replace(/"/g, '\\"');

$select.find('option[value="' +  val + '"]').show();

如果您知道该值没有任何反斜杠或引号(如您的示例中所示),那么您不需要对值中的任何内容进行转义,您只需要选择器中的引号。