将$lvl 1.lvl2.lvl3 重命名为 $lvl 1['lvl2']['lvl3']


renaming $lvl1.lvl2.lvl3 to $lvl1['lvl2']['lvl3']

我创建了一个文本区域,允许用户回显变量:

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";