MudGuard: Komplexer regulärer Ausdruck mit bedingten Unterausdrücken

Beitrag lesen

Hi,

Mein bisheriger Versuch:
/(<body(?(["'].*>.*["'])…|[^>]*)>(.*)<\/body>)/i
An Stelle des „…“ muss natürlich noch ein brauchbarer Ausdruck, aber mir fällt keiner ein.

Zur leichteren Kommentierung mal in der "Freeform"-Variante (siehe /x modifier):

/
    <body                    #Anfangs mal ein <body
    (?:                      #die Anzahl der Attribute ist 0 bis unendlich
        \s+                  #zwischen elementname und attributname bzw. zwischen
        [a-z]+               #Attributname
        (?:                  #optional hat ein Attribut auch einen Wert
            \s*              #vor dem = darf whitespace stehen
            =                #ein =
            \s*              #nach dem = darf whitespace stehen
            (?:              #Wert darf in '' oder "" stehen oder ohne Quotes
                '[^']*'      #Wert in '', evtl. auch leer, erstes ' beendet den Wert
            |
                "[^"]*"      #Wert in "", evtl. auch leer, erstes " beendet den Wert
            |
                [-a-z0-9._]+ #ggf. auch Wert ohne Quotes [1]
            )
        )?
    )*
    \s*                      #vor dem > kann Whitespace stehen
    >                        #schließt das tag
    (                        #Das wollen wir uns merken!
        .*?                  #sowenig beliebiges wie möglich
    )                        #(nur bis zum ersten (und hoffentlich einzigen) schließenden body-Tag)
    </body                   #der Anfang des schließenden body-Tags
    \s*                      #ggf. Whitespace im schließenden tag
    >                        #schließt das tag
/ix

[1] (keine Garantie auf Vollständigkeit der Zeichenliste, ggf. \S* , wenns invalides HTML ist)
oder einzeilig:

/<body(?:\s+[a-z]+(?:\s*=\s*(?:'[^']*'|"[^"]*"|[-a-z0-9._]+))?)*\s*>(.*?)</body\s*>/i

(ohne Gewähr)

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.