Jörg: Dauerthema: Regexen ;)

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

  1. Aber leider greift meine Regex nicht.

    Wo ist der Fehler?

    Ja, ok.
    Habs gesehen, ich habe ein paar Maskierungen vergessen.

    Jörg

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

      --
      sumpsi - posui - obstruxi
      1. 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

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

          --
          sumpsi - posui - obstruxi
          1. Hi,

            Only some Englisch must you can.

            Nur einige Englisch mußt Du Dose? 😉

            cu,
            Andreas a/k/a MudGuard

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

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

        --
        sumpsi - posui - obstruxi
      2. 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

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

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

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

          --
          sumpsi - posui - obstruxi
          1. Danke Rolf,

            werde ich mir zu Gemüte führen.

            Jörg

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

    --
    Wer respektiert werden will, sollte zunächst damit anfangen, andere zu respektieren.
    1. 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