Sven Rautenberg: RegExp Warning "REG_ERANGE"

Beitrag lesen

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