2013-05-19 89 views
8

在PHP中是否有等效的Python str.formatPHP等效於Python的`str.format`方法?

在Python:

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

我看到的,我可以在PHP做本身就是通過命名的條目,並使用str_replace

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

是否有任何其他PHP的本機的替代品?

+2

您是否在尋找這個http://php.net/manual/en/function.sprintf.php –

+0

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

回答

5

由於PHP並不真的要在Python str.format正確的選擇,我決定實現我最簡單的自己這是大多數Python的一個基本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. 你可以混合其他三個點。
+0

當你想要輸出一對大括號而不被解釋爲變量的佔位符時會發生什麼? – dreftymac

+0

@dreftymac一個簡單的解決將是匹配'(?<!\ {)\ {\}(?!\})',而不是僅僅'\ {\}'(負落後/提前看),所以'{{ }}'沒有被匹配,則用'{}'替換所有'{{}}'。 (可惜它也會留下'{{}'和'{}}'但沒關係,對吧?)。告訴我是否應該編輯我的代碼以反映這一點。 – JeromeJ

+0

沒問題,我猜想我想要做的基本點是在PHP中複製str.format()並不是一項簡單的任務。 – dreftymac

5

sprintf是最接近的事情。這是老式的Python字符串格式化:

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

我從來不喜歡舊的%式格式,但我想如果沒有更好的東西,它會這樣做。 – JeromeJ