Olaf Schneider: RegEx für einen Parser

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

  1. 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

    1. 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:

      1. Suche der Texte innerhalb der span-elemente
      2. Fürjeden Text ersetzen der < durch [
      3. Fürjeden Text ersetzen der > durch ]
  2. 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

  3. 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