在JavaScript中修剪&nbsp值

7
我正在尝试从Kendo编辑器中截取文本,如下所示。
var html = "  T  "; // This sample text I get from Kendo editor
            console.log("Actual :" + html + ":");
            var text = "";
            try {
                // html decode
                var editorData = $('<div/>').html(html).text();
                text = editorData.trim();                    
                console.log("After trim :" + text + ":");
            }
            catch (e) {
                console.log("exception");
                text = html;
            }

这段代码在一个独立的js文件中(由typescript生成)。当页面加载时,剪切功能无法正常工作。但是,当我在开发者工具控制台窗口中运行相同的代码时,它可以正常工作。

为什么会出现这种情况?

 const html: string = $(selector).data("kendoEditor").value();
        console.log("Actual :" + html + ":");
        let text: string = "";
        try {
            // html decode
            var editorData = $('<div/>').html(html).text();
            text = editorData.trim();
            console.log("After trim :" + text + ":");
        }
        catch (e) {
            console.log("exception");
            text = html;
        }

当页面加载时,修剪功能无法正常工作 - 我们需要更多的信息才能回答这个问题。 - Jamiec
3
&nbsp; 实际上不是空格。它由浏览器呈现为空格,但就 Javascript 而言,它不是空格,而是一个字符串。 - Liam
页面上有一个Kendo编辑器。用户输入一些文本并单击保存按钮。然后调用此JavaScript。基本上,这段代码的目的是修剪尾随空格并保存。 - PSR
运行正常:https://jsfiddle.net/rayon_1990/4v1kmc30/ - Rayon
@Rayon 当我单独运行这段代码时,它对我来说很好用。但在应用程序中它失败了。这就是为什么我觉得它很奇怪的原因。 - PSR
5个回答

11
&nbsp; 被转换成一个不间断空格字符\u00a0。JavaScript的String#trim应该移除它们,但历史上浏览器实现存在一些问题。虽然我认为这些问题在现代浏览器中已经解决了,但是......
如果你遇到没有正确实现此功能的浏览器,你可以使用正则表达式来解决这个问题:

text = editorData.replace(/(?:^[\s\u00a0]+)|(?:[\s\u00a0]+$)/g, '');

那句话的意思是将开头和结尾的所有空格或非换行空格字符替换为空。

但看到你的评论后:

当我单独运行这段代码时,它对我来说很好用。但是在应用程序中它会失败。

......也许不是那个问题。

或者,在转换为文本之前,您可以删除&nbsp;标记:

html = html.replace(/(?:^(?:&nbsp;)+)|(?:(?:&nbsp;)+$)/g, '');
var editorData = $('<div/>').html(html).text();
text = editorData.trim();    

在将标记转换为文本之前,这会删除任何位于开头或结尾的&nbsp;


@Sree:太好了!很抱歉浏览器仍然存在这个问题,但很高兴这有所帮助。 :-) - T.J. Crowder
2
@BekimBacaj:显然你没有读过(或者至少没有理解)我上面的回答,也显然没有理解对你的回答的评论。很遗憾,我对此无能为力。 - T.J. Crowder
2
@BekimBacaj:说句实话,仔细阅读规范吧。 我附上了链接就是为了这个目的。 从trim链接中可以看到:““T是一个字符串值,它是带有前导和尾随空格的S的副本。 空格的定义是WhiteSpace和LineTerminator的并集。”从Table32链接中可以看到:“ECMAScript空格代码点列在表32中:U+00A0 NO-BREAK SPACE <NBSP>...”"因此,'trim'应该去掉不间断的空格。 在那些没有问题的浏览器上,确实如此。 就像我上面说的。 - T.J. Crowder
2
@Bekim:引用你的话:“再次错误!”这里有另一个规范供您参考:https://www.w3.org/TR/html5/syntax.html#named-character-references,清楚地说明` `是U+00A0。并且证明它在现实世界中确实是正确的:https://jsfiddle.net/nyd3yb0z/。好了,我完成了。如果您觉得需要继续发布虚假信息,请引用可靠的参考文献。 - T.J. Crowder
2
@Bekim:什么胡说八道。 - T.J. Crowder
显示剩余6条评论

5
最简单的去除字符串中不间断空格的方法是:
html.replace(/&nbsp;/g,' ').trim()

1
这将删除字符串中间的空格。 - mikewasmike

2

如果您正在使用jQuery,您可以使用jQuery.trim()函数。

该函数从提供的字符串的开头和结尾删除所有换行符、空格(包括不间断空格)和制表符。 来源


0

这些都不适合我。我想要做的是仅从字符串开头或结尾而非中间删除"&nbsp;"。因此,我的建议是。

  let ingredients = str.replace(/&nbsp;/g, ' ');
  ingredients = this.ingredients.trim();
  ingredients = this.ingredients.replace(/\s/g, '&nbsp;');

var txt = 'aa&nbsp;&nbsp;cc&nbsp; &nbsp; ';
var result = txt.replace(/&nbsp;/g, ' ');
result = result.trim();
result = result.replace(/\s/g, '&nbsp;');
console.log(result);


0

这个实现对我来说已经证明是成功的

s=s.replaceAll('&nbsp;', ' ').replaceAll('<br>', ' ').trim();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接