你会想使用这样的正则表达式,而不是:
~\{\$(\w+?)(?:\|(.+?))?\}~i
然后,您可以轻松查看传递给回调的内容:
$str = 'This is a {$token|token was empty}';
$str = preg_replace_callback('~\{\$(\w+?)(?:\|(.+?))?\}~i', function($match) {
var_dump($match);
exit;
}, $str);
输出:
array(3) {
[0]=>
string(24) "{$token|token was empty}"
[1]=>
string(5) "token"
[2]=>
string(15) "token was empty"
}
从那里,您可以检查是否$match[1]
已设置,如果已设置,则返回其值,否则返回$match[2]
:
$foo = 'foo';
$str = 'Foo: {$foo|not set}, Bar: {$bar|not set}';
$str = preg_replace_callback('~\{\$(\w+?)(?:\|(.+?))?\}~i', function($match) {
if (isset($GLOBALS[$match[1]])) {
return $GLOBALS[$match[1]];
} else {
return $match[2];
}
}, $str);
var_dump($str);
输出:
string(22) "Foo: foo, Bar: not set"
注意:我在$GLOBALS
这里仅用于演示目的。如果可能的话,我建议使用 PHP 5.4 的闭包绑定,因为那时你可以为闭包分配一个特定的对象作为上下文(例如你的模板/视图对象或任何包含你试图替换的变量) . 如果你不使用 PHP 5.4,你也可以使用语法function($match) use ($obj)
,$obj
你的上下文在哪里,然后检查isset($obj->{$match[1]})
你的闭包。