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

时间:2019-03-16 17:48:36

标签: javascript html arabic farsi

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

$(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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

这里的问题是,当从DOM中读取HTML实体时,该实体会被解析,因此字符序列Class1变成了单个字符ZERO WIDTH JOINER。

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

&zwj;

即使在浏览器中,如果直接使用JavaScript控制台,一切也会按预期运行:

screen capture of JS console in browser

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

$ node
> s = '<div>&zwj;احترام</div>'
'<div>&zwj;احترام</div>'
> s.includes("&zwj;ا")
true
$(document).ready(function(){
   var htm=$("div").text();
   console.log(Array.from(htm));
   console.log(Array.from("&zwj;ا"));
})

这给出了:

Another cap

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

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>&zwj;احترام</div>
$(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>

因此RTL(文本方向)一切正常!原来,这仅是何时解析HTML实体的问题。 :)

答案 2 :(得分:1)

而不是在HTML内部搜索实体&zwj;,而是在div节点的 text 值中搜索字符本身(code point +U200D)(而不是其节点)。 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>

答案 3 :(得分: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>