Dauerthema: Regexen ;)
Jörg
- regex
Hallo,
habe mich mal wieder an eine Regex gemacht und mal wieder funktioniert sie nicht auf Anhieb:
Mein BBcode-Parser haut mir je nach Installation ein (oder mehrere) Subdirs in den Source eines base64 codierten Images rein.
Dort steht dann z.b. src="/myDir123/data:image/png;base64
snstelle von src="data:image/png;base64
. Leider weiß ich nicht, an welcher Stelle der Parser das amcht, sonst würde ich es natürlich gerne gleich an der Wurzel beheben.
So bleibt mir erstmal nicht mehr als es zu flickschustern, was in Anbetracht der seltenen Anwendung auch ok wäre.
Meine Regex sieht so aus:
$myReturnText = preg_replace('/src="(.*)data:image/png;base64/', 'src="data:image/png;base64', $myReturnText);
src=" = muss vorkommen
data:image/png;base64 = muss vorkommen
(.*) = Und dazwischen kann stehen, was will
Aber leider greift meine Regex nicht.
Wo ist der Fehler?
Jörg
Aber leider greift meine Regex nicht.
Wo ist der Fehler?
Ja, ok.
Habs gesehen, ich habe ein paar Maskierungen vergessen.
Jörg
Hallo Jörg,
ich habe nur eine gesehen. Gleichheitszeichen, Doppelpunkt und Semikolon haben meines Wissens keine Sonderbedeutung.
/src="(.*)data:image/png;base64/
____________________!___________
Statt das / zu escapen kannst Du aber auch einen anderen Regex-Delimiter nehmen, z.B. ein Backtick ` oder ein Hash #.
Rolf
Hallo Rolf,
ich habe nur eine gesehen. Gleichheitszeichen, Doppelpunkt und Semikolon haben meines Wissens keine Sonderbedeutung.
/src="(.*)data:image/png;base64/
____________________!___________
Und wie sieht es mit dem "
aus?
Statt das / zu escapen kannst Du aber auch einen anderen Regex-Delimiter nehmen, z.B. ein Backtick ` oder ein Hash #.
Ok, wußte ich gar nicht. Danke.
Jörg
Hallo Jörg,
erwähnte ich regex101.com schon? Kennt PCRE und PCRE2 (links, bei Flavor).
Der erklärt dir die Regex Punkt für Punkt. Und erklärt Dir auch, dass er zum " nichts zu erklären hat. Only some Englisch must you can.
Den Delimiter kannst Du dort auch tauschen, einfach auf das graue / klicken.
Rolf
Hi,
Only some Englisch must you can.
Nur einige Englisch mußt Du Dose? 😉
cu,
Andreas a/k/a MudGuard
Hi,
Wo ist der Fehler? Ja, ok.
Habs gesehen, ich habe ein paar Maskierungen vergessen.
und Du hast vergessen, daß * gierig ist.
Aus
src="/myDir123/data:image/png;base64abcde" src="/myDir123/data:image/png;base64
würde src="data:image/png;base64
Sprich: aus mehreren Bildelementen würde mitsamt allem, was dazwischenliegt, ein Bildelement.
Du mußt un-gierig suchen: .*?
statt .*
cu,
Andreas a/k/a MudGuard
Hallo MudGuard,
aus mehreren Bildelementen würde mitsamt allem, was dazwischenliegt, ein Bildelement
Wenn er über das ganze HTML Dokument sucht, ja.
Ich habe gemutmaßt, dass er nur den Wert des src Attributs behandelt. Das mag natürlich ein Irrtum gewesen sein.
Rolf
Hallo Andreas,
Sprich: aus mehreren Bildelementen würde mitsamt allem, was dazwischenliegt, ein Bildelement.
Du mußt un-gierig suchen:
.*?
statt.*
Kannst Du mir das ? nochmal erklären? 1 oder keins dachte ich, wäre die Bedeutung. Deshalb verstehe ich .*? nicht.
Jörg
Hi,
Du mußt un-gierig suchen:
.*?
statt.*
Kannst Du mir das ? nochmal erklären? 1 oder keins dachte ich, wäre die Bedeutung. Deshalb verstehe ich .*? nicht.
Das Fragezeichen als alleiniger Quantifier sagt 0 oder 1.
Aber in Verbindung mit + oder * sagt es: so wenig wie möglich.
(ohne ? gilt für + oder *: so viel wie möglich)
cu,
Andreas a/k/a MudGuard
Hallo Andreas,
Kannst Du mir das ? nochmal erklären? 1 oder keins dachte ich, wäre die Bedeutung. Deshalb verstehe ich .*? nicht.
Das Fragezeichen als alleiniger Quantifier sagt 0 oder 1.
Aber in Verbindung mit + oder * sagt es: so wenig wie möglich.
(ohne ? gilt für + oder *: so viel wie möglich)
Wieder was gelernt, danke 👍
Jörg
Hallo Jörg,
eine kurze Einführung zum Thema "greedy" in Regexen steht in unserem Wiki.
Die dort dargestellte Information gilt für JavaScript und ist für PHP unvollständig. Regexe verwenden aus gutem Grund ein Delimiter-Zeichen, man kann hinter dem rechten Delimiter nämlich noch Optionen angeben. Welche das sind, ist hier dokumentiert.
Das U Flag (großes U) schaltet die Greediness für die ganze Regex um. Ohne das U sind * und + greedy, und das Fragezeichen macht sie ungreedy. Mit dem U sind * und + ungreedy, und das Fragezeichen macht sie greedy.
Rolf
Danke Rolf,
werde ich mir zu Gemüte führen.
Jörg
Hallo Jörg,
Mein BBcode-Parser haut mir je nach Installation ein (oder mehrere) Subdirs in den Source eines base64 codierten Images rein.
meine These: Der Parser versucht, relative Bild-URLs zu vervollständigen; der Programmierer kannte aber noch keine data-URLs und wusste nicht, dass die anders zu handhaben sind.
Leider weiß ich nicht, an welcher Stelle der Parser das amcht, sonst würde ich es natürlich gerne gleich an der Wurzel beheben.
Schade - ja, das wäre auch meine Empfehlung gewesen.
Nicht die Symptome bekämpfen, sondern gleich die Ursache.
Live long and pros healthy,
Martin
Hallo Martin,
meine These: Der Parser versucht, relative Bild-URLs zu vervollständigen; der Programmierer kannte aber noch keine data-URLs und wusste nicht, dass die anders zu handhaben sind.
Gut möglich.
Wie gesagt, ich hätte es gerne an der Wurzel behoben, aber in diesem Fall ist der Workaround ok, weil das Ganze eh selten zum Einsatz kommt.
Jörg