代わりに DOM の使用を検討してください。必要な構造が既にあるので、ノード自体を交換します ( @maxwell のコードから大量に借用しますが、子も移動します):
var elements = document.getElementsByClassName('replace');
for(var i = elements.length-1; i>= 0; --i) {
var element = elements[i];
var newElement = document.createElement('replacetext');
var children = element.childNodes;
for(var ch = 0; ch < children.length; ++i) {
var child = children[ch];
element.removeChild(child);
newElement.appendChild(child);
}
element.parentNode.insertBefore(newElement,element);
element.parentNode.removeChild(element);
}
次に、指定されたクラスの各要素に対して、その要素の位置を使用して新しい要素を挿入し、最後にそれ自体を削除する前に、その子のそれぞれを新しい要素に移動します。
私の唯一の疑問は、getElementByClassName によって返される配列内の項目の変更が問題を引き起こすかどうかです。要素を処理する前に、要素が有効かどうかを確認するために追加のチェックが必要になる場合があります。または、これを再帰関数として記述し、最も深いノードからツリーを最初に処理することを好む場合もあります。
より多くの作業のように見えるかもしれませんが、これはより速く (変更後に html を再解析する必要はありません。要素の移動は参照値の割り当てにすぎません)、はるかに堅牢です。HTML を解析しようとすると、健康を害する可能性があります。
質問を読み直して (常に良い計画です)、文字列内のテキストから始めます。それが本当に開始点である場合 (つまり、innerHTML 値からそれを引き出しているだけではない場合)、上記を使用するには、一時的な親要素を作成するだけです。
var fosterer = document.createElement('div');
fosterer.innerHTML = text; // your variable from the question
そして、 を使用して続行しfosterer.getElementsByClassName
ます。