无法使用JavaScript替换特殊字符组合

3

我想从段落中删除所有在字符“ا”之后的‍。我使用以下方法,但控制台显示找不到此组合。请注意,这是波斯语单词,“ا”字符紧随‍之后,因为字符是从右向左书写的,而在字符“ا”之前的尾部证明它们连接在一起。

$(document).ready(function(){
   var htm=$("div").html();
   var shouldRemove="‍ا";
   if (htm.includes(shouldRemove)){
       console.log('found');
   }
   else{
       console.log('not found');
   }
})
body{font-size:26pt}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>&zwj;احترام</div>

4个回答

1
一种方法是将&zwj;ا转换为文本,使用下面的方法获取
的文本而不是其html,然后比较这两个文本:

$(document).ready(function(){
   // get the text
   var div_txt = $("div").text();
   var shouldRemove = "&zwj;ا";
   // put it as html in a span, then get it as text
   var rem_txt = $("<span>").html(shouldRemove).text();
   if (div_txt.includes(rem_txt)) {
       console.log('found');
   } else {
       console.log('not found');
   }
})
body {
    font-size:26pt
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div>&zwj;احترام</div>


1

不要在HTML中搜索实体&zwj;,而是搜索字符本身(代码点+U200D)在div节点的文本值中(不是它的HTML):

console.log("Found?", $("div").text().includes("\u200Dا"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>&zwj;احترام</div>


1
问题在于,从DOM中读取HTML实体时,实体会被解析,因此字符序列&zwj;会变成单个字符“零宽连接器”。
如果您在命令行上运行JavaScript,则您的方法将起作用。
$ node
> s = '<div>&zwj;احترام</div>'
'<div>&zwj;احترام</div>'
> s.includes("&zwj;ا")
true

即使在浏览器中直接使用JavaScript控制台,事情也会像您预期的那样正常工作:

screen capture of JS console in browser

那么,从DOM中读取有何不同(在您的情况下,使用jQuery)?为了看到发生了什么,请检查字符串中实际的字符:

$(document).ready(function(){
   var htm=$("div").text();
   console.log(Array.from(htm));
   console.log(Array.from("&zwj;ا"));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>&zwj;احترام</div>

这个意思是:“这会给出:”

Another cap

啊哈,所以jQuery正在解析HTML实体!因此,您想要搜索的文本应该具有JavaScript零宽连字符,而不是HTML。像这样指定它:

$(document).ready(function(){
   var htm=$("div").html();
   var shouldRemove="\u{200d}ا";
   if (htm.includes(shouldRemove)){
       console.log('found');
   }
   else{
       console.log('not found');
   }
})
body{font-size:26pt}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>&zwj;احترام</div>

现在它输出true
所以RTL(文本方向)一切正常!事实证明这只是HTML实体解析的问题。 :)

小补充:这与jQuery无关。document.querySelector('div').innerText也会返回已经转换为字符串的实体。 - skyboyer
谢谢,是的,你说得完全正确。我并不是要责怪jQuery,但看起来确实是那样。我已经编辑了答案。感谢你指出这一点。 - Ray Toal

0
如果您在控制台记录您的htm变量,它将输出为:‍احترام,因此当您尝试使用“‍ا”搜索它时,它会输出为“未找到”。请尝试以下方法:

$(document).ready(function(){
   var htm=$("div").html();
   var shouldRemove="ا";
   if (htm.includes(shouldRemove)){
       console.log('found');
   }
   else{
       console.log('not found');
   }
})
body{font-size:26pt}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>&zwj;احترام</div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接