2009-06-09 16 views
4

文字列のparamsを置き換える関数はありますか?このような何か:PHP変数の置換

コード:

$format_str = "My name is %name."; /* this was set in a 
             configuration file - config.php */ 

$str = xprintf($format_str, array('name' => 'Joe', 'age' => 150)); 
       /* above is somewhere in main code */ 

操作後の$ strのの期待値は次のとおりです。

My name is Joe. 

アップデート:私はsprintfのを知っています。しかし、この場合は十分ではありません。私は違いが何であるかを示すコードを修正しました。

+0

なぜWikiですか? –

+0

おそらく著者の側のエラー –

答えて

10

のように見えます。strtrは、同じことができる組み込み関数です。 (これをDrupalコードを通すことから得た)。

>> $format_str = "My name is %name."; 
My name is %name. 
>> strtr($format_str, array('%name' => 'Joe', '%age' => 150)) 
My name is Joe. 
+0

これは正確に何が必要と思われる。 – Christian

+0

strtrはこれに最適です – thomasrutter

3

あなたはこれを使用することができます。

function xprintf($str, $array, $chr = '%') { 

    foreach ($array as &$key => $val) { 
     $key = $chr . $key; 
    } 

    return strtr($str, $array); 
} 

$str = xprintf('My name is %name', array('name' => 'Joe')); 
+2

Wtf、なぜ私はdownvotedになりましたか?私はsprintfについて話していただろうが、彼が質問したところから、彼は%sだけでなく、ユニークな識別子を望んでいるようだ。 私は質問を読むためにdownvotedを取得しました-_- – Ozzy

+1

あなたの答えに似ています。彼が後にしているものに似ています:http://au2.php.net/manual/en/function.sprintf.php#83779 sprintf3の例を参照してください – Stobor

+0

リンクのThx。私の答えを自分の望み通りに更新する – Ozzy

2

あなたがsprintf()を意味するのですか?

$ str = sprintf( "私の名前は%sです。"、 'Joe');

-1

printf()に渦を付けてみてください。このウェブサイトにはprintfで配列を使用する例がたくさんあります。

printf("My name is %s", "Joe"); 
-1

あなたは常にevalを使用することができ... (息をのむ!)

$myStr = 'Hi my name is $name. I\'m $age years old.'; 
$myVars = array("name" => "Joe", "age" => 6); 
$parsed = parseString($myStr, $myVars); 

function parseString($str, $vars) { 
    extract($vars); 
    return eval('return "' . addslashes($str) . '";'); 
} 

を、誰もがextractevalの使用についての不機嫌を取得する前に、限り、あなたは、入力テンプレート文字列を管理しているとして、これがセキュリティ上の問題であるかどうかはわかりません。

-1

PHPは()のsprintfを使用せずに、配列から値を引くことができます。

​​
+0

助けてください - 実際の文字列に%が続く単語を扱うことができる必要があります。置換値が判明する前に文字列値が設定されています。 – thomasrutter

0

この機能を、 "マップ"(および置換)、私のWebアプリケーションシステムの一部である:

function replace($search, $replace, $mixed) 
{ 
    if (is_string($mixed)) { 
     return @str_replace($search, $replace, $mixed); 
    } else if (is_array($mixed)) { 
     foreach ($mixed as $k => $v) { 
      $mixed[$k] = replace($search, $replace, $v); 
     } 
     return $mixed; 
    } else { 
     return $mixed; 
    } 
} 


function map($a, $contents, $case_sensitive=false) 
{ 
    if (!is_array($a)) { 
     return $contents; 
    } 
    if (!$case_sensitive) { 
     $a = array_change_key_case($a); 
    } 
    $s = array(); 
    $r = array(); 
    foreach ($a as $k => $v) { 
     if (is_scalar($v) || empty($v)) { 
      $s[] = "{".$k."}"; 
      $r[] = $v; 
     } 
    } 
    if (!$case_sensitive) { 
     $contents = preg_replace_mixed('/{([-_ =,.\/\'"A-Za-z0-9]+)}/ei', "'{'.strtolower('\\1').'}'", $contents); 
    } 
    return replace($s, $r, $contents); 
} 

非常に良い仕事をしています。括弧で囲まれた変数名で任意の文字列を指定すると、そのトリックが実行されます。

構文は異なりますが、あなたの目的のために変更することができます

$str = map(array('name' => 'Joe'), 'My name is {name}'); 

私は%構文上で、それを好みます。

0

あなたが探しているのはvsprintfです。 http://us2.php.net/vsprintf

これにより、指定したとおりに引数の配列を渡すことができます。