Hallo,
Ich habe meine Zweifel, ob diese Methode robuster als RegExp-Fummelei über innerHTML ist. Ich würde sie sowieso nie produktiv einsetzen. Mir wäre allerdings auch keine Möglichkeit bekannt, dies mit Regulären Ausdrücken zu lösen.
Naja, es gibt da diese Netscape-Erweiterungen (lastMatch, leftContext, rightContext), die nicht Teil von ECMAScript sind. Damit geht es ganz gut, replace braucht man gar nicht:
function ersetzen (str, wort, insertbefore, insertafter) {
var expr = new RegExp('(<[^>]*)|' + wort, 'ig');
while (erg = expr.exec(str)) {
// alert(RegExp.leftContext + '[' + RegExp.lastMatch + ']' + RegExp.rightContext + ' (' + expr.lastIndex + ')');
if (RegExp.lastMatch.charAt(0) != '<' && RegExp.leftContext.substr(RegExp.leftContext.length - insertbefore.length) != insertbefore) {
str = RegExp.leftContext + insertbefore + RegExp.lastMatch + insertafter + RegExp.rightContext;
// alert('string geändert:\n\n' + str);
}
}
return str;
}
window.onload = function () {
document.body.innerHTML = ersetzen(document.body.innerHTML, 'entchen', '<span class="highlight">', '</span>');
}
Diese Erweiterungen kennen wohl nur Mozilla und MSIE ab 5.5 (letzterer ungetestet, im 5.0 könnte man etwas über lastIndex basteln).
Das bestätigt eigentlich nur, dass JavaScript nicht die richtige Technik dafür ist. Serverseitig ließen sich sowohl die DOM-Variante als auch die mit Regulären Ausdrücken zuverlässiger umsetzen.
Mathias