Stefanie Alsdorf: Script funktioniert nur fast 100% (nur bei 1 Treffer)

Hallo Ihr !

Ist mir schon ein bisschen peinlich nochmal fragen zu müssen, normalerweise versuche ich es wirklich erstmal alleine (dann bleibt's auch eher im Gedächtnis) aber hier brauche ich nochmal Eure Hilfe:

Das folgende Script funktioniert:

$test = "xxx [bild:logo1.jpg] xxx";
              $bla = ereg("[bild:(.*)]",$test,$regs);
              for ($i=1;$i<count($regs);$i++) {
                    $test = ereg_replace("[bild:".$regs[$i]."]","<a href="".$regs[$i]."">".$regs[$i]."</a>",$test);
              }
              echo "<hr>$test<hr>";

hier das aber schon nicht mehr. Einzige Unterschied: es wäre zweimal zu ersetzen.

$test = "xxx [bild:logo1.jpg] xxx [bild:logo2.jpg] xxx";
              $bla = ereg("[bild:(.*)]",$test,$regs);
              for ($i=1;$i<count($regs);$i++) {
                    $test = ereg_replace("[bild:".$regs[$i]."]","<a href="".$regs[$i]."">".$regs[$i]."</a>",$test);
              }
              echo "<hr>$test<hr>";

Warum aber funktioniert's nicht?

Bin echt auf Eure Hilfe angewiesen.

Freu mich über jede Unterstützung.

Danke,

Steffi

  1. [bild:(.*)\  ersetzt genau einmal [bild:(.*)\g ersetzt sooft es möglich ist .. sorry, daß ich schonwieder zu faul bin, die Zeilen mal durchzugucken .. ich rat einfach mal ins blaue :o)

    Falk

    1. [bild:(.*)\  ersetzt genau einmal [bild:(.*)\g ersetzt sooft es möglich ist .. sorry, daß ich schonwieder zu faul bin, die Zeilen mal durchzugucken .. ich rat einfach mal ins blaue :o)

      Falk

      Hallo Falk,

      habe prinzipell verstanden, aber mit oder ohne macht keinen Unterschied.
      Da es seltsamer Weise gar nicht mehr funktioniert, sobald ein zweites Tauschen erforderlich wäre.
      Bei einem Tausch gehts ohne Probleme, kommt ein zweiter hinzu, geht auch der erste nicht mehr!

      In der Hoffnung auf eine einfache Lösung,

      Steffi

  2. Hi

    for ($i=1;$i<count($regs);$i++) {

    Arrays fangen auch in PHP mit $array[0] an. Deshalb den Schleifenzaehler $i auf 0 setzen.

    for ($i=0;$i<count($regs);$i++)

    Jan

    1. Hi Jan,

      Arrays fangen auch in PHP mit $array[0] an. Deshalb den Schleifenzaehler $i auf 0 setzen.

      JA

      »»  for ($i=0;$i<count($regs);$i++)

      Nein.
      Lies mal die Doku zu ereg(). Das nullte Array-Element enthält den _kompletten_ gematchten String.
      Der interessiert hier aber nicht.

      Gruss,
      Carsten

  3. Hi Steffi,

    hier das aber schon nicht mehr. Einzige Unterschied: es wäre zweimal zu ersetzen.

    $test = "xxx [bild:logo1.jpg] xxx [bild:logo2.jpg] xxx";
                  $bla = ereg("[bild:(.*)]",$test,$regs);

    Das Sternchen (.*) ist gierig (greedy). Das heist es frisst erstmal alles weg, dann
    werden nach und nach Zeichen wieder rausgelassen, bis es passt. Bei deinem Beispiel
    'matched' es also folgendermaßen:

    bild:logo1.jpg] xxx [bild:logo2.jpg
    weil  [                                   ]  hier die eckigen Klammern stehen.

    Abhilfe:

    ereg("[bild:([^]*)]",$test,$regs);

    würde jedes "nicht ]" Zeichen matchen (also bis zur Klammer zu). Leider funktioniert
    das nicht (Ich weiss nicht warum). Aber

    ereg("[bild:([^\n ]*)]",$test,$regs);

    geht. Dann darf das * nur bis Zeilenende oder Leerzeichen fressen, es muss also
    immer ein Leerzeichen oder ein Zeilenende zwischen den geklammerten Ausdrücken stehen.

    Oft wird die Verwendung von preg_xxx() statt der ereg() Ausdrücke empfohlen, weil die
    schneller sind und mehr können. Die Syntax ist fast die gleiche (und steht auch
    im PHP Manual)

    preg_match("=[bild:([^]\n ]*)]=",$test,$regs);

    funktioniert.
    (Die "=" sind einer der Syntax-unterschiede, denk sie dir einfach weg, sie tun erstmal nix)

    und es kommt noch besser

    preg_match("=[bild:(.*?)]=",$test,$regs);

    funktioniert auch. Das ? treibt dem Sternchen die Gierigkeit aus.

    Gruss,
    Carsten

    1. Hallo Carsten,

      vielen Dank für Deine tolle Antwort (muss noch immer über diese gefräßigen Sternchen lächeln).

      Aber offenbar habe ich nicht die aktuellste Version installiert denn es erscheint die Fehlermeldung:

      Call to unsupported or undefined function preg_match()<<

      Und Deine Version vom 'ereg' klappt leider nur beim ersten [bild...].

      Vielleicht nochmal die Zeilen...

      $test = "xxx [bild:logo1.jpg] xxx [bild:logo2.jpg] xxx";  
      

      // $bla = preg_match("=[bild:(.*?)]=",$test,$regs);
      $bla = ereg("[bild:([^\n ]*)",$test,$regs);
      // $bla = ereg("[bild:(.*)\g]",$test,$regs);
      for ($i=1;$i<count($regs);$i++) {
        $test = ereg_replace("[bild:".$regs[$i]."]","<a href="".$regs[$i]."">".$regs[$i]."</a>",$test);
      }
      echo "<hr>$test<hr>";

      Eure verzweifelte Steffi

      1. Hi Stefanie,

        Call to unsupported or undefined function preg_match()<<

        Das sagt es bei meinem Provider auch immer, da fehlt zwar nur ne Zeile in der Konfiguration,
        aber sei's drum.

        Und Deine Version vom 'ereg' klappt leider nur beim ersten [bild...].

        *grmbl* ja. Steht ja auch da:
        Matche ein [bild:irgendwas] und nicht matche viele [bild:irgenwas] mit was dazwischen.

        Leider fällt mir nix richtig tolles dazu ein, nur was neues:

        Die erste Lösung ist etwas arg wirr aufwendig. Immerhin sieht man hier wozu der Rückgabe-
        wert von ereg(), der bei dir noch im $bla ungenutzt versackt benutzt werden kann. (Er ist true, wenn
        das ereg() gematched hat und false wenn nicht.)

        $test = "xxx [bild:logo1.jpg] xxx [bild:logo2.jpg] xxx";

        $tmp=$test;  // in $tmp steht der noch nicht geprüfte Rest

        while(ereg("[bild:([^\n ]*)](.*)",$tmp,$regs))  // solange der Ausdruck matched
        {
            $tmp=$regs[2];
            
            // TEST Ausgabe ***************
            for ($i=1;$i<count($regs);$i++)
            {
              echo "$i: $regs[$i]<br>";
            }
            echo "<br>";
            // Ende - TEST Ausgabe ***************
            
            $test = str_replace("[bild:$regs[1]]","<a href="$regs[1]">$regs[1]</a>",$test);
            // da hier nur ein 'festes' suchen/ersetzen gebraucht wird reicht str_replace
            // macht aber das selbe wie bisher.
        }
        echo "<hr>$test<hr>";

        So und nur Lösung 2: Die zaubert einfach ein ... zwei neue Kaninchen aus dem Hut:

        $test = "xxx [bild:logo1.jpg] xxx [bild:logo2.jpg] xxx";
            $test = ereg_replace("[bild:([^\n ]*)]","<a href="\1">\1</a>",$test);   // Ja, diese eine Zeile ist alles
            echo "<hr>$test<hr>";

        Erstens ereg_replace() ;
        und zweitens sogenannte Backward References (Rückwärts-Bezüge).
            \1 setzt den Wert aus dem ersten geklammerten Ausdruck wieder ein.
        eigentlich kommen die ja erst im Kapitel für Fortgeschrittene aber hier sind sie mal sooooo
        praktisch.