无法使用 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>‍احترام</div>
一种方法是将 ‍ا
转换为文本,使用下面的方法,并获取 div
的文本而不是其 html,然后比较两个文本:
$(document).ready(function(){
// get the text
var div_txt = $("div").text();
var shouldRemove = "‍ا";
// 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>‍احترام</div>
如果您使用控制台记录您的 htm 变量,它将 o/p 为:احترام,这就是为什么当您尝试使用“ا”搜索它时,它输出为 '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>‍احترام</div>
这里的问题是,当从 DOM 读取 HTML 实体时,实体被解析,因此字符序列 ‍
变成单个字符零宽度连接器。
如果您在命令行上 运行 JavaScript,那么您的方法会奏效:
$ node
> s = '<div>‍احترام</div>'
'<div>‍احترام</div>'
> s.includes("‍ا")
true
即使在浏览器中,如果您直接使用 JavaScript 控制台,一切都会像您预期的那样正常工作:
那么从 DOM 读取有什么不同(在您的情况下,使用 jQuery)?要查看发生了什么,让我们检查字符串中的实际字符:
$(document).ready(function(){
var htm=$("div").text();
console.log(Array.from(htm));
console.log(Array.from("‍ا"));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>‍احترام</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>‍احترام</div>
现在它输出 true
.
RTL(文本方向)一切正常!事实证明,这只是 HTML 实体何时被解析的问题。 :)
不是在 HTML 中搜索实体 ‍
,而是在 text 值中搜索字符本身 (code point +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>‍احترام</div>
我想从段落中删除所有 ‍
后面有字符“ا”的内容。我使用以下方法,但控制台显示找不到此组合。请考虑这是波斯语单词,字符“ا”紧接在 ‍
之后,因为字符被写为 从右到左 ,字符“ا”之前的尾巴证明它们连接在一起。
$(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>‍احترام</div>
一种方法是将 ‍ا
转换为文本,使用下面的方法,并获取 div
的文本而不是其 html,然后比较两个文本:
$(document).ready(function(){
// get the text
var div_txt = $("div").text();
var shouldRemove = "‍ا";
// 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>‍احترام</div>
如果您使用控制台记录您的 htm 变量,它将 o/p 为:احترام,这就是为什么当您尝试使用“ا”搜索它时,它输出为 '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>‍احترام</div>
这里的问题是,当从 DOM 读取 HTML 实体时,实体被解析,因此字符序列 ‍
变成单个字符零宽度连接器。
如果您在命令行上 运行 JavaScript,那么您的方法会奏效:
$ node
> s = '<div>‍احترام</div>'
'<div>‍احترام</div>'
> s.includes("‍ا")
true
即使在浏览器中,如果您直接使用 JavaScript 控制台,一切都会像您预期的那样正常工作:
那么从 DOM 读取有什么不同(在您的情况下,使用 jQuery)?要查看发生了什么,让我们检查字符串中的实际字符:
$(document).ready(function(){
var htm=$("div").text();
console.log(Array.from(htm));
console.log(Array.from("‍ا"));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>‍احترام</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>‍احترام</div>
现在它输出 true
.
RTL(文本方向)一切正常!事实证明,这只是 HTML 实体何时被解析的问题。 :)
不是在 HTML 中搜索实体 ‍
,而是在 text 值中搜索字符本身 (code point +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>‍احترام</div>