Hallo,
JavaScript-RegExps sind ziemlich mächtig, sodass man durchaus fiese Dinge damit tun kann. Beispielsweise Elemente durch einen anderen Typ ersetzen:
function replacer (all, startTag, tagName, attributes, contents, endTag) {
var replacement = map[tagName];
if (replacement) {
return '<' + replacement + attributes + '>' + parse(contents) + '</' + replacement + '>';
} else {
return startTag + parse(contents) + endTag;
}
}
function parse (str) {
console.debug('parse', str);
return str.replace(/(<(\w+)([^>]*)>)(.*?)(<\/\2>)/g, replacer);
}
var map = {
i: 'em',
b: 'strong'
};
var str = '<p>bla <strong title="bar"><i>blub</i> foo <b style="font-weight: bold">sülz</b></strong> bar <div>xoxo</div></p>'
alert(parse(str));
Natürlich ist das nicht sonderlich zuverlässig, aber das sind auch nur 12 Zeilen Code.
Will man Entscheidungen anhand des Kontextes treffen, kommt man ohne einen Parsing-Stack nicht aus (wobei Rekursion sich ja gut dazu eignet, einen solchen auf- und abzubauen). Was nicht heißt, dass man reguläre Ausdrücke nicht dafür verwenden kann, einen Stack aufzubauen.
Mathis