2012-01-13 15 views
1

'{}'の中のすべての変数名を正しい変数に置き換える関数が必要です。このような 何か:プレースホルダを実際の値に置き換えるにはどうすればよいですか?

$data["name"] = "Johnny"; 
$data["age"] = "20"; 

$string = "Hello my name is {name} and I'm {age} years old."; 

$output = replace($string, $data); 
echo $output; 

//outputs: Hello my name is Johnny and I'm 20 years old. 

私はこのためのフレームワーク/エンジンがありますけど、私はちょうどこのためにたくさんのファイルをインストールする必要がありますする必要はありません。

答えて

11

あなたはpreg_replace/e修飾子で最も簡単にこれを行うことができます。

$data["name"] = "Johnny"; 
$data["age"] = "20"; 

$string = "Hello my name is {name} and I'm {age} years old."; 

echo preg_replace('/{(\w+)}/e', '$data["\\1"]', $string); 

See it in action

置換文字列(ここでは{\w+}:1つ以上の英数字または中括弧の間の下線)と一致するパターンをカスタマイズしたい場合があります。それを関数に入れるのは簡単です。ここで

+0

ニースの解決策、+1。私は '\ w'の代わりに' [^ \}] + 'を使用しますが、 – zerkms

2

あなたが行く:

$data["name"] = "Johnny"; 
$data["age"] = "20"; 

$string = "Hello my name is {name} and I'm {age} years old."; 

foreach ($data as $key => $value) { 
$string = str_replace("{".$key."}", $value, $string); 
} 

echo $string; 
+1

うわー、私はそれを考えていないので、とても愚かではないと感じます。 – user1091856

0
$string = "Hello my name is {$data["name"]} and I'm {$data["age"]} years old."; 

は、あなたがしたいだけで何行います。それがあなたに適していない場合は、このような正規表現でループのようなものを試してください

for ($data as $key=>$value){ 
    $string = preg_replace("\{$key\}", $value, $string); 
} 

テストされていない場合は、マニュアルを参照してください。

+0

ここで 'str_replace'の代わりに' preg_replace'を使う特別な理由はありますか? – zerkms

0

あなたはそれが私がいつもstrtrのファンしてきた、わずかに異なる構文

$string = 'hello my name is %s and I am %d years old'; 

$params = array('John', 29); 

var_dump(vsprintf($string, $params)); 
//string(43) "hello my name is John and I am 29 years old" 
0

を持ってvsprintfを試してみることができます。

$ php -r 'echo strtr("Hi @name. The weather is @weather.", ["@name" => "Nick", "@weather" => "Sunny"]);' 
Hi Nick. The weather is Sunny. 

他の利点は、異なるプレースホルダプレフィックスタイプを定義できることです。これはDrupalのやり方です。 @は、(注入攻撃を避けるために)Webページに出力するために安全なものとしてエスケープされる文字列を示します。 format_stringコマンドはパラメータ(たとえば@name@weather)をループし、最初の文字が@であれば、その値にcheck_plainを使用します。

https://stackoverflow.com/a/36781566/224707

関連する問題