2

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

Hello {$name}!

...还有数组:

Hello {$person.name}

使用以下行 PREG_REPLACE 字符串,以便它可以由 PHP eval()'ed:

$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<['$*']>; ?>

抱歉,如果这让您头疼 - 它肯定让我感到头疼!

4

2 回答 2

0

我认为您应该尝试使用 mustache 代替:

mustache.github.com

于 2012-05-10T14:42:11.070 回答
0

可能应该使用现有的东西,比如布赖恩建议的胡子。

但这是一种比 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";
于 2012-05-10T14:45:45.090 回答