Jörg: preg_replace und Nutzung von Gruppe

Hallo,

wenn ich

echo preg_replace('/<img\s(.*?)scr="((.*?)\/test234\/(.*?))"(.*?)>/','$2','Das ist ein Test <img scr="././test234/12345.jpg" border="0" alt="test"> bla blub blabub');

ausführe, erhalte ich "nichts" 😕

Erwartet hätte ich aber

Das ist ein Test ././test234/12345.jpg bla blub blabub

Was verstehe ich hier falsch?

Zudem habe ich auch etwas anderes versucht:

$text = 'Das ist ein Test <img scr="././test234/12345.jpg" BORDER="0" ALT=""> bla blub blabub';
$text = preg_match('/<img\s(.*?)scr="((.*?)\/test234\/(.*?))"(.*?)>/',$text,$arr_info);
//echo "<pre>";
//print_r($arr_info);
$text = str_replace($arr_info[2],'test123',$text);
echo $text;

Hier hätte ich erwartet:

Das ist ein Test <img scr="test123" BORDER="0" ALT=""> bla blub blabub

aber heraus kommt 1.

Ok, ist schon spät, aber irgendwie hatte ich mir ein einfaches str_replace() schon noch zugetraut 😉

Wer hilft mir auf die Sprünge, wo liegen meine Denkfehler?

Jörg

  1. Tach!

    wenn ich

    echo preg_replace('/<img\s(.*?)scr="((.*?)\/test234\/(.*?))"(.*?)>/','$2','Das ist ein Test <img scr="././test234/12345.jpg" border="0" alt="test"> bla blub blabub');
    

    ausführe, erhalte ich "nichts" 😕

    Aber nicht mit dem gezeigten Code, denn der macht genau das, was du erwartest, wenn ich den in der PHP Sandbox ausführe.

    Ok, ist schon spät, aber irgendwie hatte ich mir ein einfaches str_replace() schon noch zugetraut 😉

    Du hast zwar eine Debugausgabe für $arr_info, aber nicht für $text, sonst würdest du sehen, was du da zu ersetzen versuchst.

    $arr_info ist übrigens auch kein sprechender Name. In der Variable sind die Matches, also wäre es sinnvoll sie entsprechend zu benennen.

    dedlfix.

  2. Hallo Jörg,

    ich schließe mich dedlfix da an - "nicht" sollte nicht herauskommen.

    preg_replace liefert "nichts" (also null) nur dann, wenn ein Fehler auftritt. Zum Beispiel, wenn die Regex nicht gültig ist. In der PHP Sandbox bekomme ich dann aber auch eine Warning.

    Es ist bester Brauch, in der Development-Phase Warnungen und Errors auf dem Bildschirm ausgeben zu lassen. Am besten auch die Notices. Wenn nicht Bildschirm, dann zumindest Logdatei (kann man in der php.ini konfigurieren).

    Bist Du also sicher, dass die Regex, die Du im PHP stehen hast, und die Regex in regex101 identisch sind? Oder ist da ein neckisches Klämmerchen, das sich versteckt hat?

    Ich hätte dann noch zwei Anmerkungen:

    (1) Du hast einen Typo drin: Das Attribut, nach dem Du suchst, heißt src, nicht scr. Das führt aber zu einen Nicht-Match und damit zur unveränderten Rückgabe des Eingabestrings. Einen Leerstring bzw. Null als Rückgabe erklärt es nicht.

    (2) Klammern sind schön und gut, aber zu viele sind's auch nicht. Jede Klammer erzeugt eine Group, und die können auch verwirren. Das folgende Pattern matcht ebenfalls das, was Du suchst.

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

    Allerdings ist der Substitution Marker nun $1, weil Gruppen weggefallen sind.

    Es wäre prima, wenn PHP das könnte, was regex101 behauptet: Ersetzungen mit benannten Gruppen, aber das funktioniert nicht. Und ich will mich nicht so tief in PHP reinmengen, dass ich dort einen RFC eintüten wollte. Named Replacements sind mit einer Callback-Funktion möglich.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo dedlfix, hallo Rolf,

      ok, zugegeben, für den ersten Teil meiner Frage wars wohl gestern doch zu spät.

      Der preg_replace liefert, wie bestellt 😀

      Aber der 2. Teil bereitet mir noch Kopfzerbrechen:

      $text = 'Das ist ein Test <img src="././test234/12345.jpg" BORDER="0" ALT=""> 
      echo $text."<br>";
      

      ergibt

      Das ist ein Test  bla blub blabub
      

      Ich versteh grad' nicht, warum mein Image aus $text entfernt wird? 😕

      Jörg

      1. Hallo Jörg,

        lies nach, was preg_match zurückgibt.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Jörg,

          lies nach, was preg_match zurückgibt.

          Hallo Rolf,

          das nutze ich doch im vorangegangenen Post gar nicht 😉

          Jörg

          1. Hallo Jörg,

            wie bitte? Du redest doch vom zweiten Teil, unter "Zudem habe ich auch etwas anderes versucht", oder? Und da lacht mich deutlich ein preg_match an.

            Rolf

            --
            sumpsi - posui - obstruxi
      2. Tach!

        $text = 'Das ist ein Test <img src="././test234/12345.jpg" BORDER="0" ALT=""> 
        echo $text."<br>";
        

        ergibt

        Das ist ein Test  bla blub blabub
        

        Ich versteh grad' nicht, warum mein Image aus $text entfernt wird? 😕

        Wird es das wirklich? Bist du sicher, dass es weg ist und nicht etwa der Browser nur nichts anzuzeigen hat? Ein Blick in den Quelltext oder ein Maskieren der Special Chars könnte der Sache auf den Grund gehen.

        dedlfix.

      3. Hallo,

        $text = 'Das ist ein Test <img src="././test234/12345.jpg" BORDER="0" ALT=""> 
        echo $text."<br>";
        

        ergibt

        Das ist ein Test  bla blub blabub
        

        Ich versteh grad' nicht, warum mein Image aus $text entfernt wird? 😕

        Wird es das denn? Befüll mal das Alt-Attribut. Mich wundert, wo das "bla blub" herkommt…

        Gruß
        Kalk

        1. Hallo dedlfix, hallo Tabellekalk,

          Ihr habt beide recht. Das Imgage war ein Phantasieprodukt, deshalb sah es für mich ohne Alt-Eintrag so aus, als sei es nicht da.

          Danke für den Hinweis,

          jörg

          1. Hallo,

            Ihr habt beide recht.
            Das Imgage war ein Phantasieprodukt, deshalb sah es für mich ohne Alt-Eintrag so aus, als sei es nicht da.

            und was lernen wir (wieder einmal) daraus?

            Ergebnisse von String-Operationen nicht im Browser bewerten, sondern auf Quellcode-Ebene!

            Live long and pros healthy,
             Martin

            --
            Wer respektiert werden will, sollte zunächst damit anfangen, andere zu respektieren.
            1. Hallo Martin,

              Ergebnisse von String-Operationen nicht im Browser bewerten, sondern auf Quellcode-Ebene!

              Du hast recht, aber das ist manchmal bei mir nicht so einfach möglich. Ich habe den Eindruck, dass der Browser, wenn ich auf "Quelltext" gehe, einen neuen Request macht, denn als Quelltext erhalte ich oft meine eigene Fehlermeldung eines mehrfach abgesendeten Formulares.

              In diesem Fall war das nicht so, aber in anderen Fällen schon.

              Gruß, Jörg

              1. Hallo,

                auf Quellcode-Ebene!

                Quelltext

                Quellcode-Ebene ≠ Browser-Quelltext

                Gruß
                Kalk

                1. Mahlzeit,

                  auf Quellcode-Ebene!

                  Quelltext

                  Quellcode-Ebene ≠ Browser-Quelltext

                  das ist schon richtig, aber Browser-Quelltext (Ctrl-U) hätte hier schon gereicht, um sich nicht selbst auszutricksen.

                  Live long and pros healthy,
                   Martin

                  --
                  Wer respektiert werden will, sollte zunächst damit anfangen, andere zu respektieren.