更换   来自 javascript dom 文本节点

IT技术 javascript regex html-entities
2021-01-14 00:55:39

我正在使用 javascript 处理 xhtml。我通过连接 nodeType == Node.TEXT_NODE 的所有子节点的 nodeValue 来获取 div 节点的文本内容。

生成的字符串有时包含不间断的空格实体。如何用常规空格字符替换它?

我的 div 看起来像这样...

<div><b>Expires On</b> Sep 30, 2009 06:30&nbsp;AM</div>

在网上找到的以下建议不起作用:

var cleanText = text.replace(/^\xa0*([^\xa0]*)\xa0*$/g,"");


var cleanText = replaceHtmlEntities(text);

var replaceHtmlEntites = (function() {
  var translate_re = /&(nbsp|amp|quot|lt|gt);/g;
  var translate = {
    "nbsp": " ",
    "amp" : "&",
    "quot": "\"",
    "lt"  : "<",
    "gt"  : ">"
  };
  return function(s) {
    return ( s.replace(translate_re, function(match, entity) {
      return translate[entity];
    }) );
  }
})();

有什么建议?

6个回答

这比你做的要容易得多。文本节点中不会包含文字字符串"&nbsp;",它将具有代码为 160 的相应字符。

function replaceNbsps(str) {
  var re = new RegExp(String.fromCharCode(160), "g");
  return str.replace(re, " ");
}

textNode.nodeValue = replaceNbsps(textNode.nodeValue);

更新

更简单:

textNode.nodeValue = textNode.nodeValue.replace(/\u00a0/g, " ");
谢谢蒂姆。这有效并证明比我做的更容易:)
2021-03-28 00:55:39

如果您只需要替换,&nbsp;那么您可以使用更简单的正则表达式:

var textWithNBSpaceReplaced = originalText.replace(/&nbsp;/g, ' ');

此外,您的 div 示例中有一个错字,它说&nnbsp;而不是&nbsp;.

它并没有真正涵盖这种情况。如果需要走那么远,正则表达式可能是错误的解决方案。
2021-04-09 00:55:39
它如何与   交互?CDATA 块中的字符串(因为这是 XHTML)?
2021-04-12 00:55:39
我在我的帖子中输入了错字 - 如果我使用  ,Stack Overflow 会将实体转换为帖子预览中的实际空间。
2021-04-12 00:55:39
当我在 Firebug 中检查变量时,我没有看到   - 字符串看起来像一个有效的日期。使用 UTF8 编码在十六进制编辑器中粘贴值显示 nbsp 已替换为 2 字节 unicode char \uC2A0
2021-04-12 00:55:39

第一行很乱。它只需要:

var cleanText = text.replace(/\xA0/g,' ');

这应该就是你所需要的。

这比接受的答案少了代码。谢谢。
2021-03-19 00:55:39

认为当您使用“ var foo = function() {...};定义函数时,该函数仅该行之后定义换句话说,试试这个:

var replaceHtmlEntites = (function() {
  var translate_re = /&(nbsp|amp|quot|lt|gt);/g;
  var translate = {
    "nbsp": " ",
    "amp" : "&",
    "quot": "\"",
    "lt"  : "<",
    "gt"  : ">"
  };
  return function(s) {
    return ( s.replace(translate_re, function(match, entity) {
      return translate[entity];
    }) );
  }
})();

var cleanText = text.replace(/^\xa0*([^\xa0]*)\xa0*$/g,"");
cleanText = replaceHtmlEntities(text);

编辑:此外,仅var在第一次声明变量时使用“ ”(您在变量上使用它两次cleanText)。

编辑 2:问题在于函数名称的拼写。你有“var replaceHtml Entites =”。它应该是“无功replaceHtml Entit上课=”

是的,在我的脚本中,我在使用它的地方之前有这个函数。我在这里发帖的时候忘了这样做。但它没有用。
2021-03-21 00:55:39

我用过这个,它有效:

var cleanText = text.replace(/&amp;nbsp;/g,"");