我会做一个简单的模板类来解析它,
class SimpleTemplate
{
protected $src;
protected $vars;
public function __construct($src)
{
$this->src = $src;
}
public function assign($key, $value)
{
$this->vars[$key] = $value;
}
public function out()
{
return str_replace(array_keys($this->vars),$this->vars,$this->src);
}
}
$T = new SimpleTemplate("We have received ##AMOUNT## ##CURRENCY## for your OrderID n. ##ORDER_ID##");
$T->assign('##AMOUNT##', 'foo');
$T->assign('##CURRENCY##', 'bar');
$T->assign('##ORDER_ID##', 'hello');
echo $T->out();
输出:
"We have received foo bar for your OrderID n. hello"
你可以看到here live:
您可以随时扩展它并添加功能,例如从作业中删除##,并删除任何未使用的标签。等等……
基本上,它只是一个用于变量的数组管理工具。因为我们正在构建一个这样的数组:
[
'##AMOUNT##' => 'foo',
'##CURRENCY##' => 'bar',
'##ORDER_ID##' => 'hello'
];
然后使用str_replace我们使用键作为搜索,值作为替换值。
如果您想从标签分配中删除##,只需更改以下内容:
public function assign($key, $value)
{
$this->vars['##'.$key.'##'] = $value;
}
然后像这样调用:
$T->assign('AMOUNT', 'foo');
这里真正的好处是有一个类来实现你的逻辑。它保持干净和可重用。
更新
正如 @LawrenceCherone 在 cmets 中提到的那样,您可以通过使用一些神奇的方法来获得更干净的界面。
class SimpleTemplate
{
protected $src;
protected $vars;
public function __construct($src)
{
$this->src = $src;
}
public function __set($key, $value)
{
$this->vars['##'.strtoupper($key).'##'] = $value;
}
public function __toString()
{
return str_replace(array_keys($this->vars),$this->vars,$this->src);
}
}
$T = new SimpleTemplate("We have received ##AMOUNT## ##CURRENCY## for your OrderID n. ##ORDER_ID##");
$T->Amount = 'foo'; //any casing works because of the transforms, in __set
$T->CURRENCY = 'bar';
$T->order_id = 'hello';
echo $T; //using __toString() lets us just output the class as our result string.
特别是__set 和__toString。对于这个,我在key 上做了一些转换,以使其更不容易出错,也更难看。例如,对动态属性使用混合套管。通过使用strtoupper,它们可以在任何情况下输入,删除#可以避免像$T->{'##AMOUNT##'} = 'foo';这样包装它们
我要补充的最后一件事是,如果您可以拥有未分配但想要删除它们的“标签”,您可以使用此 regx 来删除它们。
public function __toString()
{
$str = str_replace(array_keys($this->vars),$this->vars,$this->src);
return preg_replace(['/##\w+##/', '/\s{2,}/'], ['', ' '], $str); //remove any left over ##{word}## tags, and compress any run-on spaces.
}
你可以看到这个here的例子
数组/\s{2,}/、 中的第二个只是在空格上运行并将它们压缩到一个空格,所以如果你有 4 个空格,它就会变成一个空格。它没有很好的文档记录,但 preg_replace 可以像 str_replace 一样采用数组。
这就是我建议建立一个类的原因,它为您提供了一个实现所有这些“东西”的好地方,如果您愿意,并且不必一直重写它。