preg_replace und Array-Value

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • preg_replace und Array-Value

    Hallo ,

    Ich habe mal wieder ein Frage bezüglich preg_replace(). Folgende Situation: Ich möchte in einem String alle %irgendwas% durch den Wert des Arrays $x['irgendwas'], also als Key den Wert zwischen % und %. Folgender Ansatz:

    Array $x:
    Code:
    Array ( [1] => '2010-02-17' [2] => 'schoen' )
    PHP-Code:
    echo preg_replace('/%(.+?)%/','$1','Heute haben wir den <strong>%1%</strong>, das ist %2%.'); 
    Aber eigentlich möchte ich das so:

    PHP-Code:
    echo preg_replace('/%(.+?)%/',$x['$1'],'Heute haben wir den <strong>%1%</strong>, das ist %2%.'); 
    Nur, wie bekomme ich das hin? Weil so geht es nicht... kann mir da jemand weiterhelfen?

  • #2
    PHP-Code:
    echo preg_replace('/%(.+?)%/e''$x[\'\\1\']''Heute haben wir den <strong>%1%</strong>, das ist %2%.'); 
    Falls du nicht sicher sein kannst, ob die %Zahl%-Platzhalter wirklich als Key in $x existieren, solltest du besser preg_replace_callback() benutzen. Sonst hagelt es Notices wegen undefined index.
    Zuletzt geändert von onemorenerd; 17.02.2010, 12:49.

    Kommentar


    • #3
      Oke super, so klappt's.

      Vielen Dank . Aber das mit dem callback bekomm ich (wieder) nicht hin:

      PHP-Code:
      return preg_replace_callback('/%(.+?)%/'
      create_function('$foo,$x','return ((isset($x[$foo[1]]))?$x[$foo[1]]:\'%\'.$foo[1].\'%\';')
      ,
      'Heute haben wir den <strong>%1%</strong>, das ist %2%.'); 
      Wie muss ich $x[] schreiben in der Callback, oder muss ich das nicht mit übergeben?

      Jetzt ersetze ich einfach den String wenn er existiert und sonst belasse ich ihn so wie er ist.

      Kommentar


      • #4
        Das haben wir schon:
        PHP-Code:
        $x = array(
            
        => '2010-02-17',
            
        => 'schoen',
        );

        $pattern '%(.+?)%';
        $subject 'Heute haben wir den <strong>%1%</strong>, das ist %2%. %3%';

        // Notice:  Undefined index:  3
        echo preg_replace('/'.$pattern.'/e''$x[\'\\1\']'$subject); 
        Um die Notice zu vermeiden, habe ich dir preg_replace_callback() empfohlen. Diese Funktion übergibt dem Callback aber immer nur einen einzigen Parameter. Das kannst du nicht ändern.

        Wenn $x wie in diesem Beispiel global ist, kannst du es in den Callback importieren.
        PHP-Code:
        echo preg_replace_callback('/'.$pattern.'/'create_function('$matches''
            global $x;
            return isset($x[$matches[1]]) ? $x[$matches[1]] : \'\';
        '
        ), $subject); 
        Das ist allerdings ziemlich unsauber. Es wäre besser, wenn x ein Property einer Klasse ist und der Callback eine Methode dieser Klasse – oder wenn du es mit Currying löst. In PHP 5.3 könnte man auch ein Closure verwenden.
        Ist aber alles ziemlich kompliziert und in deinem Fall auch nicht nötig, denn es gibt einen einfacheren Weg: Bleib bei preg_replace() und nutze die Tatsache, dass bei Verwendung des e-Modifier der zweite Parameter als PHP-Code evaluiert wird.
        PHP-Code:
        echo preg_replace('/'.$pattern.'/e''isset($x[\'\\1\']) ? $x[\'\\1\'] : \'\''$subject); 
        Zuletzt geändert von onemorenerd; 17.02.2010, 17:01.

        Kommentar


        • #5
          Oke super . Vielen Dank für deine Kompetente Hilfe . Man lernt nie aus .

          Kommentar

          Lädt...
          X