2013-05-19 60 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