Hallo,
Du kannst z.B. die Attribut-Ersetzung in der Tag-Ersetzungsroutine unterbringen. Das grundlegende Problem ist und bleibt, dass du einen richtigen Parser bräuchtest, damit das Markup präzise aufbereitet werden kann. Die Frage ist, ob regulären Ausdrücke in JavaScript ein effizientes und effektives Mittel dazu ist. Gibt es keine andere Möglichkeit, als mit innerHTML zu arbeiten und diesen String clientseitig aufzubereiten? Was liest du da mit innerHTML überhaupt aus? Jede andere Alternativmöglichkeit, die sich bietet, erscheint mir sinnvoller, als eine entsprechende Routine in JavaScript über reguläre Ausdrücke zu schreiben.
Wie auch immer, hier ein prototypische Demonstration eines abgewandelten Konzepts, das Attribute rudimentär berücksichtigt:
var reststring = "<a bla=a>...</a>...<a BLA=BLUB MURKS=murks FOO='BAR'>...", stringneu = "", left = "", tag = "";
var restattribute = "", attributeneu = "";
var expr1 = new RegExp("(</?)([A-Z]+)([^>]*?)>");
var expr2 = new RegExp("([A-Z]+)=([^ "']+)");
var erg1, erg2;
while (erg1 = expr1.test(reststring)) {
alert(
stringneu + " | " + reststring + "\n" +
RegExp.leftContext + "[" + RegExp.lastMatch + "]" + RegExp.rightContext + "\n" +
"Treffer: [" + RegExp.$1 + "] [" + RegExp.$2 + "] [" + RegExp.$3 + "]"
);
left = RegExp.leftContext;
reststring = RegExp.rightContext;
tag = RegExp.$1 + RegExp.$2.toLowerCase();
restattribute = RegExp.$3;
if (restattribute != "") {
attributeneu = "";
while (erg2 = expr2.test(restattribute)) {
alert(
"attributverarbeitung\n" +
attributeneu + " | " + restattribute + "\n" +
RegExp.leftContext + '[' + RegExp.lastMatch + "]" + RegExp.rightContext + "\n" +
"Treffer: [" + RegExp.$1 + "] [" + RegExp.$2 + "]"
);
attributeneu += RegExp.leftContext + " " + RegExp.$1.toLowerCase() + "="" + RegExp.$2 + '"';
restattribute = RegExp.rightContext;
}
attributeneu += restattribute;
tag += attributeneu;
}
tag += ">";
stringneu += left + tag;
}
stringneu += reststring;
alert("Ergebnis: " + stringneu);
Das wird viel zu kompliziert und bleibt trotzdem unzuverlässig, ich kann dir nur davon abraten und empfehlen, einen anderen Lösungweg zu suchen.
Mathias