RegEx für einen Parser
Olaf Schneider
- programmiertechnik
Hallo,
ich möchte ein HTML-Dokument wie folgt modifizieren:
Bei allen Tags, die innerhalb eines Span-Containers stehen, sollen die spitzen durch eckige Klammern ersetzt werden. Aus
<bla><bla><span><bla1><bla2><bla3></span><bla>
soll also
<bla><bla><span>[bla1][bla2][bla3]</span><bla>
werden.
Kann ich sowas mit einer RegEx abhandeln? Wenn ich
/<span>.*(<)([^>]*)(>).*</span>/gi
schreibe (Code ungeprueft), wird ja nur das erste Vorkommen innerhalb des <span>-Bereiches gefunden.
Any ideas?
Gruss Olaf Schneider
P.S.: Ach ja, ich bin auf die RegEx von Javascript angewiesen
Ahoi,
/<span>.*(<)([^>]*)(>).*</span>/gi
schreibe (Code ungeprueft), wird ja nur das erste Vorkommen innerhalb des <span>-Bereiches gefunden.
Nicht alle Probleme lassen sinch durch _einen_ RegExp lösen!
ich schlage folgene Schrittfolge vor:
1. Suche der Texte innerhalb der span-elemente
2. Fürjeden Text ersetzen der < durch [
3. Fürjeden Text ersetzen der > durch ]
nich wahr?
Kube
Hallo Kube,
das hatte ich fast befürchtet. Ich wollte vor allem den nicht erwähnten Schritt 4 sparen, nämlich den veränderten Teilstring sauber wieder in den Gesamtstring einzubauen. Dann muß ich mich wohl doch um die Verwaltunge von Länge und Position aller Teilstrings selber kümmern. Schade!
Gruss Olaf Schneider
Nicht alle Probleme lassen sinch durch _einen_ RegExp lösen!
ich schlage folgene Schrittfolge vor:
- Suche der Texte innerhalb der span-elemente
- Fürjeden Text ersetzen der < durch [
- Fürjeden Text ersetzen der > durch ]
hi,
<bla><bla><span><bla1><bla2><bla3></span><bla>
soll also
<bla><bla><span>[bla1][bla2][bla3]</span><bla>
sowas?
<html>
<head>
<script language="javascript1.2">
var str = "<bla><bla><span><bla1><bla2><bla3></span><bla>";
var reg = /^(.*<span>)(.+)(</span>.*)$/;
var modStr;
var inStr = reg.exec(str);
alert(inStr[2]);
modStr = inStr[2].replace(/</g,"[");
modStr = modStr.replace(/>/g,"]");
alert(inStr[1] + modStr + inStr[3]);
</script>
</head>
<body>
regex
</body>
</html>
hth + Gruss Joachim
N'abend Olaf,
Du könntest vielleicht folgendes probieren:
<html>
<head>
<title>span_replace_IE_moz_opera7</title>
<script type='text/javascript'>
var d=document, r=RegExp;
onload=function ()
{var i=o=d.body.innerHTML;
o=R(o,/[\n|\r]/g,'~zz~'); // Zeilenumbrüche ersetzen - wg IE & opera7 vs moz
while(o.match(/((<span>)([^<]*)(?:<)([^>]+)(?:>)((?:.(?!<span>))*)(</span>))/i))with(r)o=R(o,$1,$2+$3+'['+$4+']'+$5+$6);
o=R(R(R(o,/(?:~zz~)+/g,'\n'),/[SPAN]/ig,'<SPAN>'),/[/SPAN]/ig,'</SPAN>'); // und wieder einfügen
alert(i+'\n\n'+o);
};
function R(r0,r1,r2){return r0.replace(r1,r2)};
</script>
</head>
<body>
<span><q>Hallo,ich
möchte ein HTML-Dokument wie folgt
modifizieren:</q></span>Bei allen Tags, die innerhalb eines Span-Containers stehen,
<span><tt id='QUER'>qwer</tt><i class='gansqwer'>gans
qwer</i></span><div>wuff</div>
<span><big>sollen die spitzen durch eckige Klammern<q> hargngrmph </q>
ersetzt werden
</big></span>
<span><samp>Aus</samp></span>
<div>maus</div><span><acronym>1</acronym><strong >22</strong ><cite>333
</cite></span><div>klaus</div>soll also
<div>ei der</div><span>[][][]</span><div>daus</div>
werden.
<div>soso</div><span><dfn>quadsch</dfn><em>mit</em><abbr>sauce</abbr></span>
quargl quurgl
<div>nanu</div><span><small>asdf</small><kbd>yxcv</kbd></span><div>schrömpf</div>
Kann ich sowas mit einer RegEx abhandeln? Wenn ich<span>.*(<)([^>]*)(>).*</span>/gi
schreibe (Code ungeprueft), wird ja nur das erste Vorkommen
<div>klabau</div><span><b id='totalQWER'>dodalqwer</b><i class='vullkummeqwer'>VULLKUMMEqwer</i></span><div>termann</div>
innerhalb des span-Bereiches gefunden.Any ideas?Gruss Olaf SchneiderP.S.: Ach ja, ich bin auf die RegEx von Javascript angewiesen
</body>
</html>
Geprüft hab' ich jetzt nur in moz1.2, phoenix0.5, nn7, opera7 und IE6.
gruß
werndt