Martin: Backrefence in preg_replace

Hallo,

bin sehr verzweifelt:

wieso funktioniert sowas nicht:

function weekday($month, $day)
{
   return date("d m Y", mktime(0,0,0,$month,$day,date("Y"));
}

$html_text = preg_replace("/(([0-9]{2}).([0-9]{2}).)/", "\1  ".weekday("\3","\2"), $html_text);

Die Variablen $month und $day sind korrekt gefüllt (kann man
mit return oder echo überprüfen).

Sobald die Variablen aber in einer anderen Funktion benutzt werden,
sind sie leer.

Wer kann mir helfen ??

Gruß
Martin

  1. hi,

    Die Variablen $month und $day sind korrekt gefüllt (kann man
    mit return oder echo überprüfen).

    Wo hast du das überprüft?
    Hast du Ausgaben direkt innerhalb von weekday() gemacht, und diese kommen richtig, wenn du diese Funktion wie beschrieben in preg_replace einbaust?

    $html_text = preg_replace("/(([0-9]{2}).([0-9]{2}).)/", "\1  ".weekday("\3","\2"), $html_text);

    Ich bin mir nicht sicher, ob du derart eine Funktion mit den per preg ermittelten Suchtreffern aufrufen kannst.
    Für solche Zwecke ist eigentlich eher preg_replace_callback() gedacht - schon mal damit probiert?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. echo $begrüßung;

    wieso funktioniert sowas nicht:

    function weekday($month, $day)
    {
       return date("d m Y", mktime(0,0,0,$month,$day,date("Y"));
    }

    $html_text = preg_replace("/(([0-9]{2}).([0-9]{2}).)/", "\1  ".weekday("\3","\2"), $html_text);

    Was hier passiert ist folgendes:
    1. die Funktion weekday wird mit den beiden Strings \3 und \2 aufgerufen.
    2. mktime beschwert sich mit einer Warnung, dass ihm diese Strings nicht passen.
    3. mktime gibt false zurück, das durch PHPs Typumwandlung zu 0 wird.
    4. date gibt das zum Timestamp 0 passende Datum formatiert zurück "01 01 1970".
    5. preg_replace wird aufgerufen. Der zweite Parameter lautet: \1  01 01 1970

    preg_replace_callback(), wie wahsaga schon empfahl, wäre auch meine Empfehlung.

    Sobald die Variablen aber in einer anderen Funktion benutzt werden, sind sie leer.

    Variablen leben ohne weiteres Zutun nur innerhalb des Scopes in dem sie definiert sind. Siehe Handbuch-Kapitel Variable scope

    echo "$verabschiedung $name";

  3. Hallo,

    wieso funktioniert sowas nicht:

    function weekday($month, $day)
    {
       return date("d m Y", mktime(0,0,0,$month,$day,date("Y"));
    }

    $html_text = preg_replace("/(([0-9]{2}).([0-9]{2}).)/", "\1  ".weekday("\3","\2"), $html_text);

    Um im Ersetzungsstring von preg_replace() PHP-Code ausführen zu können, musst du den Modifikator "e" benutzen:

    http://de.php.net/manual/de/function.preg-replace.php#AEN119702

      
    $html_text = '12.31.';  
      
    function weekday(  
    $month, $day  
    ) {  
      return(  
       date('d m Y', mktime(0,0,0,$month,$day,date("Y") ) )  
      );  
    }  
      
    $html_text = preg_replace('/(([0-9]{2})\.([0-9]{2})\.)/e', '"$1".weekday("$3","$2")', $html_text);  
      
    printf("Das kommt raus: (%s)<br />", $html_text);  
    
    

    Mit "back references" hat das aber nichts zu tun ... ;-)

    MffNG
    EisFuX

    --
    Erinnert mich ein Bisschen an die if-then-Schleifen von Java.
    (Alexandra Freund, IT-Compactkurs)