0

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

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;');
4

3 回答 3

2
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/

于 2012-07-27T19:57:44.297 回答
1
f = f.replace(/\ {3,}/g,' &#160; ');

这样可行。 replace只需要两个参数。
演示:http: //jsfiddle.net/SjydF/

于 2012-07-27T20:00:49.180 回答
1

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

 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 替换为其实体,将第二个替换为空白:replace(/\u00a0{2}/g, "&#160; ")
  • 仅替换两个相邻 nbsp 中的第一个:replace(/\u00a0(.)/g, "&#160;$1")
  • 用两个空格和一个实体替换三个空格:replace(/\s{3}/g, " &#160; ")
于 2012-07-27T20:04:19.357 回答