JavaScript:在 XMLSerializer 错误地解析实体后,用 html 160 实体替换三个空格

JavaScript: replace three spaces with html 160 entity after XMLSerializer incorrectly parses entities

本文关键字:实体 替换 html 空格 三个 XMLSerializer 错误 JavaScript      更新时间:2024-03-18

我正在尝试做这样的事情...

f = f.replace('   ','   ','gi');

我也试过这个...

f = f.replace(/' {3,}/g,'   ','gi');

如何用上面的实体替换三个空格?

使用's不起作用,我已经在Stack上进行了许多其他问答,但没有任何效果。

为了澄清起见,这个问题源于除了序列化之外的XMLSerializer()解析,空格位于每个句子的开头。我使用它使代码在编辑时可读。

XHTML 编辑器中的示例占位符文本(只是一个文本区域(...

 <p>1
 &#160; 2
 &#160; 3
 &#160; 4
 &#160; 5</p>

。目标是序列化此代码并保留实体(序列化不应解析,但所有浏览器都解析(,或通过替换后遗症来"反解析"。

此外,变量 f 是一个字符串,而不是示例中的对象或片段。

重要!

使用 encodeURI 后,发现这些不是由 XMLSerializer() 生成的空格,(添加空格以使其更具可读性(%0A %20 %C2 %A0 %C2 %A0


以下是使用encodeURI确定字符之前和之后的文本外观的几个示例,因为它们不匹配空格,从而使试图提供帮助的人望而却步......

%0A%20&#160;&#160;First%20and
&#160;&#160;First and

第一个插入了两个实体,不可取,我只需要一个。

&#160; Which is actually
%0A%20&#160;%20Which%20is%20actually

第二个输出使用@Bergi中的以下内容效果很好...

f = f.replace(/'u00a0/g, '&#160;')

以下是不成功的尝试,最后一个是成功的尝试......

//f = f.replace(/^'s+|'s+$/g,'');
//f = f.replace('   ',' &#160; ','gi');
//f = f.replace( / {3,}/g, '&#160;' );
//f = f.replace(/ {3,}/g,' 'u00a0 ');
//f = f.replace(/' {3,}/g,' &#160; ');
f = f.replace(/ 'u00a0/g, ' &#160;');
var f = "Hello      World";
f = f.replace( / {3,}/g, '&#160;' );
console.log(f);
// "Hello&#160;World"

听起来您的问题与字符串替换无关,而是您如何使用它来修改 HTML。你为此做了什么?

编辑:如果您希望用户在浏览器中实际看到&#160;,则需要:

f = f.replace( /'s+{3,}/g, '&amp;#160;' );

演示:http://jsfiddle.net/wrMMy/

不要用 entitiy 替换,而是替换为实际字符:

 f = f.replace(/ {3,}/g,' 'u00a0 ');

当然,这取决于该字符串的输出,但通常您应该按原样使用字符串。

顺便说一句:为了使html/xml空格可读,我建议使用css属性white-space:pre-wrap而不是插入不间断字符。他们尤其使复制文本变得恐怖。此外,如果您希望显示与源中一样多的空格,则应将/'s{2}/替换为 " 'u00a0"


好的,你有一个非常奇怪的输入:换行符(10%0A"'n"(,一个普通空格(32%20" "(和两个不间断空格(160%C2%A0"'u00a0"(。您现在可以做什么来获得所需的输出:

    将第一个 NBSP
  • 替换为其实体,将第二个 NBSP 替换为空白:replace(/'u00a0{2}/g, "&#160; ")
  • 仅替换两个相邻 NBSP: replace(/'u00a0(.)/g, "&#160;$1") 中的第一个
  • 将三个空格替换为两个空格和一个介于:replace(/'s{3}/g, " &#160; ")之间的实体
f = f.replace(/' {3,}/g,' &#160; ');

这行得通。 replace只需要两个论点。
演示:http://jsfiddle.net/SjydF/