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

4 回答 4

1

一种方法是使用下面的方法将 转换&zwj;ا为文本,并获取 的文本div而不是其 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>

于 2019-03-16T17:56:58.383 回答
1

这里的问题是,当从 DOM 读取 HTML 实体时,实体会被解析,因此字符序列&zwj;会变成单个字符的零宽度连接符。

如果您要在命令行上运行 JavaScript,您的方法将起作用:

$ node
> s = '<div>&zwj;احترام</div>'
'<div>&zwj;احترام</div>'
> s.includes("&zwj;ا")
true

即使在浏览器中,如果您直接使用 JavaScript 控制台,一切都会按照您的预期正常运行:

浏览器中 JS 控制台的屏幕截图

那么从 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>

这给出了:

另一个帽子

啊哈,所以 jQuery 正在解析 HTML 实体!因此,您要搜索的文本应该是JavaScript zwj,而不是 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 实体何时被解析的问题。:)

于 2019-03-16T18:14:24.050 回答
1

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

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>

于 2019-03-16T18:20:00.793 回答
0

如果您控制台记录您的 htm 变量,它将 o/p 为:‍احترام,这就是为什么当您尝试使用“‍ا”搜索它时,它会输出为“未找到”。请尝试以下方法:

$(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>

于 2019-03-16T18:03:16.873 回答