2010-07-13 3 views
6

Ich habe eine Zeichenfolge, die mehrere Übereinstimmungen enthalten kann (jedes Wort von Prozentzeichen umgeben) und ein Array von Ersetzungen - sie Schlüssel der jeder Ersatz ist die Übereinstimmung von die Regex. Einige Code wird wahrscheinlich erklären, dass eine bessere ...PHP preg_replace - Finden der Ersetzung von einem Array mit der Übereinstimmung als Schlüssel

$str = "PHP %foo% my %bar% in!"; 
$rep = array(
    'foo' => 'does', 
    'bar' => 'head' 
); 

Das gewünschte Ergebnis Wesen:

$str = "PHP does my head in!" 

ich folgendes versucht haben, von denen keine Arbeit:

$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str); 
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str); 
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str); 
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str); 

So drehe ich Überlauf für Hilfe stapeln. Irgendwelche Abnehmer?

Antwort

7
echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str); 

gibt:

 
PHP does my head in! 

the docs for the modifier 'e' See.

+3

Der Modifikator 'e' ist seit PHP 5.5 "veraltet und die Verwendung wird dringend abgeraten". nach den in dieser Antwort zitierten Dokumenten. Eine alternative Lösung mit preg_replace_callback() wird vorgestellt [http://stackoverflow.com/questions/16237882/preg-replace-using-pattern-as-index-of-replacement-data-array] – user9645

+0

Und die 'e 'Modifizierer ist ab PHP 7.0.0 ENTFERNT. – Jpsy

2

Sie die eval Modifikator verwenden könnte ...

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str); 
1

nur eine Alternative zu bieten, um zu preg_replace():

$str = "PHP %foo% my %bar% in!"; 
$rep = array(
    'foo' => 'does', 
    'bar' => 'head' 
); 


function maskit($val) { 
    return '%'.$val.'%'; 
} 

$result = str_replace(array_map('maskit',array_keys($rep)),array_values($rep),$str); 
echo $result; 
2

Es scheint, dass der Modifikator "e" ist veraltet. Es gibt Sicherheitsprobleme. Alternativ können Sie den Parameter preg_replace_callback verwenden.

$res = preg_replace_callback('/\%([a-z_]+)\%/', 
          function($match) use ($rep) { return $rep[$match[1]]; }, 
          $str); 
Verwandte Themen