Matthias: RegExp Warning "REG_ERANGE"

Hallo,

ich habe einen regulären Ausdruck gebildet, der meine Dateien nach img-Tags durchforsten soll. Ziel soll es sein das img-Tag in drei Teile aufzuspalten
a) alles vor dem "src" Attribut
b) Inhalt des "src" Attributs
c) alles nach dem "src" Attribut

Hier mein Ausdruck:
_____________________________________________________
(<img )(((class|id|style|title|alt|align|alt|border|height|name|usemap|width|onmouseover)="[\w\-"';:,\.\(\)=/ ]*" )*)src="([\w/\-\. ]*)"(([ ]*(class|id|style|title|alt|align|alt|height|name|usemap|width|onmouseover)="[\w\-"';:,\.\(\)=/ ]*"[ ]*)*)( />)
_____________________________________________________

Für eine bessere lesbarkeit ist diese Version wohl besser geeignet:
_____________________________________________________
(<img )
 (
  (
   (class|id|style|title|alt|align|alt|height|name|usemap|width|onmouseover)
   ="[\w\-"';:,\.\(\)=/ ]*"
  )*
 )
 src="
 ([\w/\-\. ]*)
 "
 (
  (
   [ ]*
   (class|id|style|title|alt|align|alt|border|height|name|usemap|width|onmouseover)
   ="[\w\-"';:,\.\(\)=/ ]*"[ ]*
  )*
 )
 ( />)
_____________________________________________________

Genutzt wird die Funktion ereg_replace(...) von PHP. Wenn ich aber meinen Ausdruck verwende wird der komplette Datensatz gelöscht, ich versteh einfach nicht warum, zumal in meinem Regex-Tester (The Regex Coach) der Ausruck und der Datensatz richtig zusammenarbeiten.
Hab ich vielleicht die Backslashes falsch auskommentiert. Ich seh leider keinen Fehler und PHP hilft mir da nicht unbedingt weiter "Warning: ereg_replace()... REG_ERANGE in c:........php on line x"

Weiß jemand woran es liegen könnte?

Grüße, Matthias

  1. Moin!

    ich habe einen regulären Ausdruck gebildet, der meine Dateien nach img-Tags durchforsten soll. Ziel soll es sein das img-Tag in drei Teile aufzuspalten
    a) alles vor dem "src" Attribut
    b) Inhalt des "src" Attributs
    c) alles nach dem "src" Attribut

    Das klingt doch einfach. Du machst es dir aber nicht einfach.

    Zunächst mal suchen wir den Tag-Start: "<img "

    Dann "alles": ".*"

    Dann das Attribut: "src=".*?"" (Anmerkung: " oder ' sind gültige Attributbegrenzer, und böse HTML-Schreiber lassen beide auch komplett weg, der Browserfehlerkorrektur "sei Dank").

    Dann wieder "alles": ".*"

    Und am Ende die schließende Klammer: ">"

    Zusammen also vorläufig:
    <img .*src=".*?".*>

    src=".*?" ist non-greedy, findet also das Minimum möglicher Zeichen, um den Ausdruck zu finden, nicht das Maximum.

    Ist jedenfalls deutlich simpler, als deine Version - die diverse, aber eben nicht alle (!) möglichen, Attribute eines Image-Tags aufzählt, und deshalb versagen muß, wenn der Quelltext sich nicht an deine Regex-Erwartung hält:

    Hier mein Ausdruck:
    _____________________________________________________
    (<img )(((class|id|style|title|alt|align|alt|border|height|name|usemap|width|onmouseover)="[\w\-"';:,\.\(\)=/ ]*" )*)src="([\w/\-\. ]*)"(([ ]*(class|id|style|title|alt|align|alt|height|name|usemap|width|onmouseover)="[\w\-"';:,\.\(\)=/ ]*"[ ]*)*)( />)
    _____________________________________________________

    Genutzt wird die Funktion ereg_replace(...) von PHP.

    Nutze nie die ereg-Funktionen, nutze immer die preg-Funktionen.

    Wenn ich aber meinen Ausdruck verwende wird der komplette Datensatz gelöscht, ich versteh einfach nicht warum, zumal in meinem Regex-Tester (The Regex Coach) der Ausruck und der Datensatz richtig zusammenarbeiten.

    Nirgendwo hast du Code angegeben, der irgendwas löscht. Ich sehe da nur reguläre Ausdrücke (die zudem offenbar unzulässig viele Backslashes enthalten).

    Hab ich vielleicht die Backslashes falsch auskommentiert. Ich seh leider keinen Fehler und PHP hilft mir da nicht unbedingt weiter "Warning: ereg_replace()... REG_ERANGE in c:........php on line x"

    Weiß jemand woran es liegen könnte?

    An deinem Code. Aber den kennt noch niemand, also bist du noch auf dich allein gestellt. Ändere das doch einfach!

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. gudn tach!

      Zusammen also vorläufig:
      <img .*src=".*?".*>

      src=".*?" ist non-greedy, findet also das Minimum möglicher Zeichen, um den Ausdruck zu finden, nicht das Maximum.

      der rest sollte afais ebenfalls non-greedy sein, also

      /<img .*?src=".*?".*?>/

      sonst wuerden u.u. mehrere bilder uebersprungen.

      und wenn nun die der string wie gewuenscht gesplittet werden soll, dann kann man das z.b. durch

      /<img (.*?)src="(.*?)"(.*?)>/

      bewerkstelligen.

      ach so und zum REG_ERANGE-warning: da hilft google etwas weiter (z.b. http://laurikari.net/tre/api.html). oder auch das archiv dieses forums: </archiv/2004/7/t84973/>.

      prost
      seth

      1. Hallo,

        danke für die Hinweise,
        ich werde das morgen direkt ausprobieren.

        Bzgl. der Attribute ist mir das klar, ich habe aber bestimmte nicht mit aufgeführt weil ich die in meinem Leben noch nicht benutzt habe.

        Bzgl. non-greedy, das war mein Problem, weshalb ich es so ausführlich gemacht habe, weil meine einfachen Versionen so "gierig" waren.

        Grüße, Matthias