79

javascriptを使用してxhtmlを処理しています。nodeType == Node.TEXT_NODE であるすべての子ノードの nodeValue を連結して、div ノードのテキスト コンテンツを取得しています。

結果の文字列には、非改行スペース エンティティが含まれることがあります。これを通常のスペース文字に置き換えるにはどうすればよいですか?

私のdivは次のようになります...

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

Web で見つかった次の提案は機能しませんでした。

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

助言がありますか?

4

9 に答える 9

157

これは、作成するよりもはるかに簡単です。テキストノードにはリテラル文字列"&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, " ");
于 2009-09-30T08:51:48.197 に答える
37

置換のみが必要な場合&nbsp;は、はるかに単純な正規表現を使用できます。

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

また、あなたの div の例にはタイプミスがあり、&nnbsp;代わりに&nbsp;.

于 2009-09-30T02:25:01.857 に答える
12

その最初の行はかなりめちゃくちゃです。必要なのは次のとおりです。

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

それだけで十分です。

于 2009-09-30T14:44:51.327 に答える
7

「 」で関数を定義すると、関数はその行のにのみ定義されると思います。つまり、これを試してください: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変数を初めて宣言するときにのみ " " を使用します (変数で 2 回使用していcleanTextます)。

編集2:問題は関数名のスペルです。「var replaceHtml Entites =」があります。「var replaceHtml Entit i es ="

于 2009-09-30T02:24:31.170 に答える
6

私はこれを使用しましたが、うまくいきました:

var cleanText = text.replace(/&amp;nbsp;/g,"");
于 2010-08-05T09:26:06.267 に答える
5
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];
}) );
};

これを試してください.....これは私にとってはうまくいきました

于 2012-11-24T08:04:15.097 に答える
1

そのようなすべてのシンボルが持つ&との間のすべてを削除します。;それらを取り除きたい場合。

text.replace(/&.*;/g,'');
于 2015-03-24T11:19:53.003 に答える