PHP有像Python的模板字符串这样的功能吗?

Cas*_*ash 23 php string templates template-variables

Python有一个称为模板字符串的功能.

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
Run Code Online (Sandbox Code Playgroud)

我知道PHP允许你写:

"Hello $person"
Run Code Online (Sandbox Code Playgroud)

并已$person替换,但模板可以在代码的各个部分重用?

Jam*_*yle 38

你也可以使用strtr:

$template = '$who likes $what';

$vars = array(
  '$who' => 'tim',
  '$what' => 'kung pao',
);

echo strtr($template, $vars);
Run Code Online (Sandbox Code Playgroud)

输出:

tim likes kung pao
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的缺点之一是没有 IDE 可以帮助您验证模板及其参数,您基本上只能靠自己。 (2认同)

sbe*_*rry 8

我认为有很多方法可以做到这一点......但是我想到了这一点.

$search = array('%who%', '%what_id%');
$replace = array('tim', 'kung pao');
$conference_target = str_replace(
    $search,
    $replace,
    "%who% likes %what%"
);
Run Code Online (Sandbox Code Playgroud)

哈,我们甚至在使用vsprintf的框架中有一个:

class Helper_StringFormat {

    public static function sprintf($format, array $args = array()) {

        $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);

        for ($pos = 0; preg_match('/(?<=%)\(([a-zA-Z_]\w*)\)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) {
            $arg_pos = $match[0][2];
            $arg_len = strlen($match[0][0]);
            $arg_key = $match[1][0];

            if (! array_key_exists($arg_key, $arg_nums)) {
                user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING);
                return false;
            }
            $format = substr_replace($format, $replace = $arg_nums[$arg_key] . '$', $arg_pos, $arg_len);
            $pos = $arg_pos + strlen($replace);
        }

        return vsprintf($format, array_values($args));
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来它来自sprintf页面

这允许像这样的调用:

sprintfn('second: %(second)s ; first: %(first)s', array(
    'first' => '1st',
    'second'=> '2nd'
));
Run Code Online (Sandbox Code Playgroud)

更新
这是一个更新,你想做什么...虽然没有经过充分测试

class Helper_StringFormat {

    public static function sprintf($format, array $args = array()) {
        $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);

        for ($pos = 0; preg_match('/(?<=%)\(([a-zA-Z_][\w\s]*)\)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) {
            $arg_pos = $match[0][1];
            $arg_len = strlen($match[0][0]);
            $arg_key = $match[1][0];

            if (! array_key_exists($arg_key, $arg_nums)) {
                user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING);
                return false;
            }
            $format = substr_replace($format, $replace = $arg_nums[$arg_key] . '$', $arg_pos, $arg_len);
            $pos = $arg_pos + strlen($replace); // skip to end of replacement for next iteration
        }

        return vsprintf($format, array_values($args));
    }
}

$str = "%(my var)s now work with a slight %(my var2)s";
$repl = array("my var" => "Spaces", "my var2" => "modification.");

echo Helper_StringFormat::sprintf($str, $repl);
Run Code Online (Sandbox Code Playgroud)

OUTPUT
Spaces现在可以进行一些修改.


Ron*_*Ron 5

另一个更简单的方法是:

$s = function ($vars) {
    extract($vars);
    return "$who likes $what";
};
echo $s(['who' => 'Tim', 'what' => 'King Pao']); // Tim likes King Pao
Run Code Online (Sandbox Code Playgroud)

是的,PHPStorm会抱怨...


Mig*_*uel 5

您可以使用模板字符串

echo“ Hello {$ name} {$ info [” last_name“]}”“,其中先前定义了$ name和$ info数组。

  • 这应该是正确答案。只有一件事,为什么它不适用于单个顶点? (5认同)

Noa*_*ash 5

我个人最喜欢sprintf(或vsprintf,用于参数数组)。它将它们按照预期的顺序放置,根据需要强制类型,并且具有更多可用的高级功能。

例子:

$var = sprintf("%s costs %.2f dollars", "Cookies", 1.1);
Run Code Online (Sandbox Code Playgroud)

这将产生值Cookies cost 1.10 dollars

有适合不同用例的一整套 printf 函数,所有这些都列在“另请参阅”下。

非常通用:提供变量、数组组件、函数结果等的方法相同。