簡體   English   中英

無法使用javascript替換特殊的字符組合

[英]Can not replace a special combination of characters using javascript

我想刪除所有‍ 從段落后面有字符“ا”。 我使用以下方法,但控制台說沒有找到這種組合。 請考慮這是波斯語單詞,字符“ا” ‍‍ 當字符從右到左書寫時,字符“ا”之前的尾部證明它們連在一起。

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

一種方法是使用下面的方法將&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> 

這里的問題是,當從DOM讀取HTML實體時,實體會被解析,因此字符序列&zwj; 變成單個字符ZERO WIDTH JOINER。

如果要在命令行上運行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實體何時被解析的問題。 :)

而不是搜索實體&zwj; 在HTML內部,在div節點的文本值(而不是HTML)中搜索字符本身( 代碼點+ U200D ):

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

如果您在控制台上記錄您的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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM