Невозможно заменить специальную комбинацию символов с помощью JavaScript - PullRequest
3 голосов
/ 16 марта 2019

Я хочу удалить из абзаца все ‍, которые имеют символ "ا" после. Я использую следующий метод, но консоль говорит, что эта комбинация не найдена. Пожалуйста, учтите, что это персидское слово, и символ «ا» сразу после ‍, так как символы написаны Справа налево и хвост, прежде чем символ «ا» доказывает, что они связаны друг с другом.

$(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 голос
/ 16 марта 2019

Вместо поиска сущности &zwj; внутри HTML, ищите сам символ ( кодовая точка + U200D ) в значении text узла 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 голос
/ 16 марта 2019

Проблема здесь в том, что при чтении сущности HTML из DOM, сущность анализируется, поэтому последовательность символов &zwj; превращается в одиночный символ ZERO WIDTH JOINER.

Ваш подход будет работать, если выдолжны были запустить 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 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-сущности анализируются.:)

1 голос
/ 16 марта 2019

Один из способов сделать это - преобразовать &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>
0 голосов
/ 16 марта 2019

Если вы запишете в журнал свою переменную htm, она будет иметь o / p как: ‍احترام, поэтому, когда вы пытаетесь найти ее с помощью «& zwj; ا», она выводится как «not found». Пожалуйста, попробуйте следующий подход:

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