2009-09-30 13 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

を...それを何ですか? – brianreavis

+0

私の投稿に誤字を入れました - 使用した場合、プレビューの実際のスペースにエンティティを変換していました  – user158678

+0

ちょっと、関数名の入力ミスのようです。私の質問に編集を参照してください。 – Kip

答えて

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

に感謝の気持ちで置き換えられたことが明らかになりました。これは私が作っていたより簡単だったと証明した:) – user158678

+0

優れた - 先端のための歓声。 –

+0

は、何かを全面的に手伝ってくれました。 –

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

編集::他の言葉では、これを試してみてください。また、唯一のあなたは(あなたがcleanText変数に二回、それを使用している)変数を宣言「var」を初めて使用。

編集2:問題は、関数名の綴りです。あなたは "var replaceHtml エンティティ ="を持っています。

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

また、タイプミスがあります:あなただけ、あなたがはるかに簡単正規表現を使用することができます&nbsp;を交換する必要がある場合には、 " Entit ES = VaRのreplaceHtml"

+0

はい、私のスクリプトでは、私が使用する場所の前に機能があります。私がここに投稿したときにそのようにするのを忘れてしまった。しかし、それは動作しませんでした。 – user158678

21

する必要がありますdivの例では&nbsp;の代わりに&nnbsp;と表示されます。

+0

これはCDATAブロックの文字列 (これはXHTMLなので)とはどのようにやりとりしますか? – cletus

+0

それは本当にそのケースをカバーしていません。それを遠くにする必要がある場合、正規表現はおそらく間違った解決策です。 – bobbymcr

+0

私は私のポストに誤植を入れました - 私が使用した場合、スタックオーバーフローは、投稿プレビューの実空間に変換していました  – user158678

2

こと最初の行はかなり混乱しています。それだけでする必要があります:

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

あなたが必要とするすべてする必要があること。

+0

ありがとう - これもうまくいきました! – user158678

4

私はこれを使用し、それが働いた:

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

これは私のために働く。 :Dありがとう –

+0

ありがとう。これは私のために働く唯一のものです。 –

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

動作しません置き換える... このコード試してください:あなたのデータは問題ではありません "` `&nnbsp;" を

str = str.split("&quot;").join('"'); 
関連する問題