2013-05-19 17 views
8

PHPに相当するPython str.formatはありますか? PythonでPythonの `str.format`メソッドに相当するPHP?

"my {} {} cat".format("red", "fat") 

私はネイティブPHPで行うことができます参照してくださいすべてのエントリを命名し、str_replaceを使用することです:

str_replace(array('{attr1}', '{attr2}'), array('red', 'fat'), 'my {attr1} {attr2} cat') 

は、他のPHPのネイティブの選択肢はありますか?

+2

あなたはこれを探していますか? –

+0

** seealso:**:https://stackoverflow.com/questions/5701985/vsprintf-or -sprintf-with-named-arguments – dreftymac

答えて

5

が、私は非常に単純な自身を実装することを決定したPythonの1の基本的なfunctionnalititesのほとんどとして。

function format($msg, $vars) 
{ 
    $vars = (array)$vars; 

    $msg = preg_replace_callback('#\{\}#', function($r){ 
     static $i = 0; 
     return '{'.($i++).'}'; 
    }, $msg); 

    return str_replace(
     array_map(function($k) { 
      return '{'.$k.'}'; 
     }, array_keys($vars)), 

     array_values($vars), 

     $msg 
    ); 
} 

# Samples: 

# Hello foo and bar 
echo format('Hello {} and {}.', array('foo', 'bar')); 

# Hello Mom 
echo format('Hello {}', 'Mom'); 

# Hello foo, bar and foo 
echo format('Hello {}, {1} and {0}', array('foo', 'bar')); 

# I'm not a fool nor a bar 
echo format('I\'m not a {foo} nor a {}', array('foo' => 'fool', 'bar')); 
  1. 注文は
  2. 、(マッチした最初の{}{0}などに変換されます)あなたはそれが単にインクリメントしたい場合は、名前/番号を省略することができます
  3. 、重要ではありません。パラメータの名前を付けることができます。
  4. 他の3つのポイントを混在させることができます。
+0

変数のプレースホルダとして解釈されないで中括弧のペアを出力したい場合はどうなりますか? – dreftymac

+0

@dreftymac '\ {\}'(ネガティブ・ルック・バック・アンド・アヘッド)の代わりに '(?<!\ {)\ {\}(?!\}) }} 'が一致していなければ、' {{}} 'を' {} 'に置き換えます。 (残念なことに '{{}'と '{}} 'の後ろにも残っていますが、それは問題ありません。それを反映するためにコードを編集する必要があるかどうか教えてください。 – JeromeJ

+0

問題はありません。私が作ろうとしていた基本的な点は、PHPでstr.format()を複製することは簡単なことではないということです。 – dreftymac

5

sprintfは最も近いものです。これは、古いスタイルのPython文字列フォーマットです:PHPは本当にPythonでstr.formatへの適切な代替手段を持っていないとして

sprintf("my %s %s cat", "red", "fat") 
+0

私は以前の%スタイルの書式設定が好きではありませんでしたが、それ以上のものがなければそれが実現すると思います。 – JeromeJ

関連する問題