まず、X ブラウザーの dom-parser 関数を次に示します。
var parseXML = (function(w,undefined)
{
'use strict';
var parser,ie = false;
switch (true)
{
case w.DOMParser !== undefined:
parser = new w.DOMParser();
break;
case new w.ActiveXObject("Microsoft.XMLDOM") !== undefined:
parser = new w.ActiveXObject("Microsoft.XMLDOM");
parser.async = false;
ie = true;
break;
default :
throw new Error('No parser found');
}
return function(xmlString)
{
if (ie === true)
{//return DOM
parser.loadXML(xmlString);
return parser;
}
return parser.parseFromString(xmlString,'text/xml');
};
})(this);
//usage:
var newDom = parseXML(yourString);
var allTags = newDom.getElementsByTagName('*');
for(var i=0;i<allTags.length;i++)
{
if (allTags[i].tagName.toLowerCase() === 'span')
{//if all you want to work with are the spans:
if (allTags[i].hasChildNodes())
{
//this span has nodes inside, don't apply regex:
continue;
}
allTags[i].innerHTML = allTags[i].innerHTML.replace(/[.,?!'"]+/g,'');
}
}
これは途中で役立つはずです。DOM には引き続きアクセスできるため、フィルタリング/置換が必要な文字列が見つかった場合はいつでも、使用してノードを参照しallTags[i]
、コンテンツを置換できます。すべての
要素をループすることはお勧めできませんが、私はあなたのためにすべての作業を行う気がしませんでした;-)。処理しているノードの種類を確認する必要があります。
if (allTags[i].tagName.toLowerCase() === 'span')
{//do certain things
}
if (allTags[i].tagName.toLowerCase() === 'html')
{//skip
continue;
}
そして、そのようなもの...
このコードはテストされていませんが、以前の質問に対する私の回答の簡略化されたバージョンであることに注意してください。パーサービットは問題なく動作するはずです。実際、他の質問のために設定したフィドルを次に示します。このコードは、ニーズに合わせてこのコードを変更する方法も示しています