我创建了一个文本区域,允许用户回显变量:
Hello {$name}!
。和数组也是:
Hello {$person.name}
使用 follling 行PREG_REPLACE字符串,以便 PHP 可以对其进行 eval((:
$input = preg_replace( $patter , $replacement , $input);
我让它与浅层变量一起工作:
'/{'$([a-zA-Z0-9_-]*)}/'
变得<?php echo $$1; ?>
。对于 1- 2 级或 3 级深度阵列:
'/{'$([a-zA-Z0-9_-]*)'.([a-zA-Z0-9_-]*)'.([a-zA-Z0-9_-]*)'.([a-zA-Z0-9_-]*)}/'
变得<?php echo $$1['$2']['$3']['$4']; ?>
但我真正想要的是无限的关卡...像....
'/{'$([a-zA-Z0-9_-]*)<'.([a-zA-Z0-9_-]*)>}/'
变得<?php echo $$1<['$*']>; ?>
对不起,如果这让你头疼 - 它肯定会让我!
我认为你应该尝试使用胡子:
mustache.github.com
可能应该使用现有的东西,比如布莱恩建议的小胡子。
但这是比 eval 更合理的替换方法。您需要做的就是调整您喜欢的任何点表示法解析功能。
<?php
$input = 'Hello {$name}! Hello {$person.name}! Hello {$person.unknown}!';
$data = array(
'name' => 'fred',
'person' => array(
'name'=>'freddie'
)
);
// extract tokens
preg_match_all('/{'$([A-Z.]*)}/i', $input, $tokens);
// declare non-recursive dot notation resolver
function resolve_token($data, $token){
$token = str_replace(array('{','}','$'), '', $token);
$steps = explode('.', $token);
foreach($steps as $step){
if( !isset($data[$step]) ) return false;
$data = $data[$step];
}
return $data;
}
// get token list
$list = array();
foreach($tokens[0] as $token){
$list[$token] = resolve_token($data, $token);
// if you want to leave unresolved tokens in place
// remove from $list, or never add to $list
}
$output = str_replace( array_keys($list), array_values($list), $input);
echo "original: {$input}'n";
echo "output: {$output}'n";