Sandra: Wer erklärt mir diese preg_replace_callback Funktion

Hallo,

ich habe folgenden Code gefunden, als ich auf der Suche nach einer Möglichkeit war, pdf-files zu generieren. Dieser Code sucht in einem pdf-file nach Platzhaltern in der Form "[[$foo1]]" und ersetzt diesen durch "$foo1", was sich in dem Array "$pdf_vars" befindet.
Das funktioniert auch wunderbar, nur wüsste ich auch gerne, wie genau das funktioniert (Suchmuster und eigentliches Ersetzen).

Könnte mir das vielleicht jemand erklären? Unter php.net bin ich bei diesem Beispiel nicht schlau geworden.

Vielen Dank!

Gruß Sandra

function replace_pdf_var($match){
    if (isset($GLOBALS['pdf_vars'][$match[1]])) {
        return $GLOBALS['pdf_vars'][$match[1]];
    } else {
        return $match[1];
    }
}

if(file_exists($pdffile)){
    if ($fp = fopen($pdffile, 'rb')) {
        $template = fread ($fp, filesize ($pdffile));
        fclose ($fp);

$pdf = preg_replace_callback('#[[$([^]]+)]]#',
            'replace_pdf_var', $template);

$fp = fopen ("brief.pdf","w");
  fwrite($fp,$pdf);
  fclose($fp);
     }
}

  1. Hallo Sandra.

    Hallo,

    ich habe folgenden Code gefunden, als ich auf der Suche nach einer Möglichkeit war, pdf-files zu generieren. Dieser Code sucht in einem pdf-file nach Platzhaltern in der Form "[[$foo1]]" und ersetzt diesen durch "$foo1", was sich in dem Array "$pdf_vars" befindet.
    Das funktioniert auch wunderbar, nur wüsste ich auch gerne, wie genau das funktioniert (Suchmuster und eigentliches Ersetzen).

    Könnte mir das vielleicht jemand erklären? Unter php.net bin ich bei diesem Beispiel nicht schlau geworden.

    Vielen Dank!

    Gruß Sandra

    function replace_pdf_var($match){

    if (isset($GLOBALS['pdf_vars'][$match[1]])) {
            return $GLOBALS['pdf_vars'][$match[1]];
        } else {
            return $match[1];
        }
    }

    if(file_exists($pdffile)){
        if ($fp = fopen($pdffile, 'rb')) {
            $template = fread ($fp, filesize ($pdffile));
            fclose ($fp);

    $pdf = preg_replace_callback('#[[$([^]]+)]]#',
                'replace_pdf_var', $template);

    $fp = fopen ("brief.pdf","w");
      fwrite($fp,$pdf);
      fclose($fp);
         }
    }

      
    Schrittweise:  
      
    1) Das Muster wird angewandt und gibt aus „[[$foo]]“ die Zeichenkette „foo“ zurück.  
      
    2) Diese Treffer wird per Callback an die Funktion replace\_pdf\_var() übergeben, welche diesen als Array $match entgegen nimmt. $match[0] entspricht hierbei dem gesamten Treffer („[[$foo]]“) und $match[1] dem geklammerten („foo“).  
      
    3) Nun überprüft die Funktion, ob es im Array $GLOBALS['pdf\_vars'] einen Schlüssel namens „foo“ gibt; ist dem so, wird sein Wert zurück gegeben. Ist dem nicht so, wird wiederum „foo“ zurückgegeben.  
      
    4) Wieder zurück in preg\_replace\_callback() wird nun die Zeichenkette „[[$foo]]“ durch den soeben zurück gegebenen Wert ersetzt.  
      
      
    Einen schönen Sonntag noch.  
      
    Gruß, Mathias  
    
    -- 
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|  
      
    debian/rules
    
    1. Hi, erstmal ein großes DANKE für deine super Antwort.

      1. Das Muster wird angewandt und gibt aus „[[$foo]]“ die Zeichenkette „foo“ zurück.

      Dieses Muster ('#[[$([^]]+)]]#')... was bedeutet die #? Er sucht diverse "general escape character", also [[$ und ]], aber den Rest verstehe ich nicht ganz

      1. Nun überprüft die Funktion, ob es im Array $GLOBALS['pdf_vars'] einen Schlüssel namens „foo“ gibt; ist dem so, wird sein Wert zurück gegeben. Ist dem nicht so, wird wiederum „foo“ zurückgegeben.

      Und das finde ich krass: die eine Zeile
      "return $GLOBALS['pdf_vars'][$match[1]]" macht das alles? Klar muss ja so sein :-)

      Nochmals danke, und einen schönen Abend.

      Gruß Sandra

      1. Hallo Sandra.

        1. Das Muster wird angewandt und gibt aus „[[$foo]]“ die Zeichenkette „foo“ zurück.
          Dieses Muster ('#[[$([^]]+)]]#')... was bedeutet die #?

        Die Raute ist einer der frei wählbaren Delimiter.

        Er sucht diverse "general escape character", also [[$ und ]], aber den Rest verstehe ich nicht ganz

        Dann dröseln wir auch dies einmal auf:

        # - Anfangsdelimiter

        [[$ - Die Zeichenkette „[[$“

        ([^]]+) - Ein oder beliebig viele Zeichen die keine schließende eckige Klammer sind; eine so genannte Negation also

        ]] - Die Zeichenkette „]]“

        # - Enddelimiter

        Nochmals danke, und einen schönen Abend.

        Dankeschön.

        Gruß, Mathias

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        debian/rules
        1. Super!! Jetzt wo ich alles verstanden habe, kann ich es auch benutzen.

          Gruß Sandra

          1. Hallo Sandra.

            Super!! Jetzt wo ich alles verstanden habe, kann ich es auch benutzen.

            Diese Denkweise lese ich gerne.

            Gruß, Mathias

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            debian/rules