2010-12-16 9 views
4

Ich habe ein Array:PHP - preg_replace Elemente in eckigen Klammern mit Array-Elemente

array('id' => 'really') 

Ich habe eine Zeichenfolge:

$string = 'This should be {id} simple.'; 

Ich möchte am Ende mit:

This should be really simple. 

Ich habe einen regulären Ausdruck, der mit dem {id} -Aspekt funktioniert, aber es fällt mir schwer, das zu tun, was ich will.

{id} könnte alles sein, {foo} oder {bar} oder irgendetwas, das meinem regulären Ausdruck entspricht.

Ich bin mir sicher, dass es eine einfache Lösung gibt, die mir im Moment entgeht.

Danke,

Justin

Antwort

5

str_replace ist schneller als preg_replace, versuchen Sie dies:

$arr = array('a' => 'a', 'b' => 'b'); 
$str = "{a} {b} {c}"; 
$values = array_values($arr); 
$keys = array_keys($arr); 

foreach ($keys as $k => $v) { 
    $keys[$k] = '{'.$v.'}'; 
} 

str_replace($keys, $values, $str); 
+0

Das ist richtig, aber $ arr (in Ihrem Beispiel) könnte 100er Schlüssel/Wert-Paare haben, ich frage mich, ob Ihre Lösung noch schneller wäre. Vielen Dank. – manumoomoo

+0

vielleicht können Sie das $ arr auf eine Art und Weise bauen, dass es direkt die '{' und '} enthält? dann brauchst du die zusätzliche Schleife nicht. Aber wie auch immer..es ist immer noch O (n) ;-) Wenn du keine ausgefallenen Ersetzungsregeln brauchst, solltest du diese Funktion immer anstelle von ereg_replace() oder preg_replace() verwenden. siehe: http://php.net/manual/en/function.str-replace.php – Stuck

0

preg_replace_callback hat eine Rückrufoption, die diese Art der Dinge möglich zu machen.

function replaceText($matches){ 
    global $data; 
    return $data[$matches[1]]; 
} 
preg_replace_callback(
     '/{([a-zA-Z\_\-])*?}/i', 
     'replaceText', 
     $content 
); 

Wenn Sie nicht wollen, die globale Variable erstellen eine Klasse verwenden und die array($object, 'method') Callback-Notation.

+0

Danke. Ich habe preg_replace_callback vergessen. – manumoomoo

4

Sie die preg_replace mit e Modifikator als verwenden können:

$string = preg_replace('/{([a-zA-Z\_\-]*?)}/ie','$arr["$1"]',$string); 

Ideone Link

Mit dem e Modifikator Sie welche haben kann PHP Ausdruck im Ersatzpar t preg_replace.

Nun, warum hat Ihre Regex /{([a-zA-Z\_\-])*?}/i nicht funktioniert?

Sie haben *? außerhalb der einfangenden Klammer () eingegeben. Dadurch erfassen Sie nur das erste Zeichen des in { } gefundenen Worts.

Beachten Sie auch, dass Sie nicht { und }, die Meta-Zeichen sind regex zum Spezifizieren Bereich quantifier {num}, {min,max} verwendet entgangen haben. Aber in Ihrem Fall gibt es keine Notwendigkeit, um sie zu entkommen, weil die Regex-Engine kann aus dem Kontext, dass { und } kann nicht als Bereichsoperator abgeleitet werden, da sie keine Zahlen in erforderlichen Format in ihnen haben und damit behandelt sie buchstäblich.

+0

danke für die Updates meiner Regex und die anderen hilfreichen Hinweise. Dummer Fehler wirklich. Danke noch einmal. – manumoomoo

+0

\ e Modifikator ist [veraltet] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) ab v5.5 – kodeart