2009-09-30 152 views
39

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

生成的字符串有时包含一个不间断的空间实体。我如何用普通的空格字符替换它?

我的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]; 
    })); 
    } 
})(); 

有什么建议?

+1

“''&nnbsp;”你的数据是没有问题的......是什么呢? – brianreavis 2009-09-30 02:24:42

+0

我把拼写错误放在我的文章中 - 如果我使用  – user158678 2009-09-30 06:04:55

+0

,堆栈溢出将实体转换为实际空间在实际空间中嘿,它看起来像函数名称中的拼写错误。请参阅编辑我的问题。 – Kip 2009-09-30 18:02:58

回答

90

这比你做得更容易。该文本节点将不会有文字字符串"&nbsp;"中,它必须与代码对应的字符160

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

textNode.nodeValue = replaceNbsps(textNode.nodeValue); 

UPDATE

即使简单:

textNode.nodeValue = textNode.nodeValue.replace(/\u00a0/g, " "); 
+1

,谢谢tim。这工作,并证明是比我更容易:) – user158678 2009-09-30 23:41:55

+0

棒极了 - 欢呼的提示。 – 2012-05-01 13:59:49

+0

完全帮助我的东西,谢谢。 – 2012-09-02 02:19:02

4

认为当你定义为“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替换HTML 实体 =”。它应该是“无功replaceHtml Entit ES =”

+0

是的,在我的脚本中,我在我使用它的地方之前有这个功能。当我在这里发布时,忘了这样做。但它没有奏效。 – user158678 2009-09-30 06:09:09

21

如果您只需要更换&nbsp;那么你可以使用一个简单得多的正则表达式:

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

此外,还有一个错字在你的div例子中,它表示&nnbsp;而不是&nbsp;

+0

这与CDATA块中的 字符串有什么关系(因为这是XHTML)? – cletus 2009-09-30 02:27:35

+0

它并没有真正涵盖这种情况。如果需要这么做,正则表达式可能是错误的解决方案。 – bobbymcr 2009-09-30 02:32:43

+0

我把拼写错误放在我的文章中 - Stack Overflow在实际的空间中将实体转换为实际空间,如果我使用  – user158678 2009-09-30 06:03:37

2

那第一行相当混乱。它只需要:

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

这应该是你所需要的。

+0

谢谢 - 这也适用! – user158678 2009-09-30 23:46:55

4

我用这个,和它的工作:

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

这个为我工作。 :D谢谢 – 2013-06-19 16:54:02

+0

谢谢。这是唯一为我工作的人。 – 2013-09-19 09:48:04

4
var text = "&quot;&nbsp;&amp;&lt;&gt;"; 
text = text.replaceHtmlEntites(); 

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

试试这个.....这对我工作

1

删除所有这些符号具有的&;之间的所有内容。如果你急于摆脱它们。

text.replace(/&.*;/g,''); 
0

为我更换不起作用...... 试试这个代码:

str = str.split("&quot;").join('"');