PHP与Python的等价物';s`str.format`方法?

PHP与Python的等价物';s`str.format`方法?,php,python,replace,language-comparisons,Php,Python,Replace,Language Comparisons,PHP中是否有Pythonstr.format的等价物 在Python中: "my {} {} cat".format("red", "fat") 在PHP中,我所能做的就是命名条目并使用str\u replace: str_replace(array('{attr1}', '{attr2}'), array('red', 'fat'), 'my {attr1} {attr2} cat') 还有其他PHP的本机替代方案吗?是最接近的。这是旧式的Python字符串格式: sprintf("my

PHP中是否有Python
str.format
的等价物

在Python中:

"my {} {} cat".format("red", "fat")
在PHP中,我所能做的就是命名条目并使用
str\u replace

str_replace(array('{attr1}', '{attr2}'), array('red', 'fat'), 'my {attr1} {attr2} cat')
还有其他PHP的本机替代方案吗?

是最接近的。这是旧式的Python字符串格式:

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

由于PHP在Python中并没有合适的
str.format
替代品,所以我决定实现我自己的非常简单的PHP,它是Python的大部分基本函数

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'));
  • 顺序不重要
  • 如果希望名称/编号简单地递增,则可以省略它(匹配的第一个
    {}
    将转换为
    {0}
    ,等等)
  • 您可以命名您的参数
  • 你可以混合其他三点

  • 我知道这是个老问题,但我认为值得一提:

    (PHP4、PHP5、PHP7)

    strtr-翻译字符或替换子字符串

    说明:

    strtr ( string $str , string $from , string $to ) : string
    strtr ( string $str , array $replace_pairs ) : string
    
    即使更改数组项顺序,也会生成相同的输出:

    <?php
    var_dump(
    strtr(
        "test {test1} {test1} test1 {test2}",
        [
            "test" => "one",
            "test1" => "three",
            "{test1}" => "two",
            "{test2}" => "four"
        ]
    ));
    
    ?>
    
    string(22) "one two two three four"
    
    
    弦(22)“一二二三四”
    
    你在找这个吗?另请参见::我从来都不喜欢旧式格式,但我想如果没有更好的格式,它也可以。如果你想输出一对大括号而不将其解释为变量的占位符,会发生什么情况?@dreftymac一个简单的修复方法是匹配
    (?而不仅仅是
    \{}
    (消极的向后看/向前看)所以
    {}
    不匹配,然后用
    {}
    替换所有
    {}
    (不幸的是,它也会留下
    {}
    {}
    ,但这很好,不是吗?)。请告诉我是否应该编辑代码以反映这一点。没问题,我想我想说的基本点是,在PHP中复制str.format()并不是一项简单的任务。我主要需要它的基本用法,我很高兴它变得如此简洁,但它肯定不是详尽无遗的。:)没有声明是。感谢您的输入。由于签名与
    str_replace
    one超级等效,如果有人感兴趣,下面列出了这两种方法之间的区别:
    string(22) "one two two three four" 
    
    <?php
    var_dump(
    strtr(
        "test {test1} {test1} test1 {test2}",
        [
            "test" => "one",
            "test1" => "three",
            "{test1}" => "two",
            "{test2}" => "four"
        ]
    ));
    
    ?>
    
    string(22) "one two two three four"