2

ユーザーが変数をエコーできるようにするテキストエリアを作成しました。

Hello {$name}!

...そして配列も:

Hello {$person.name}

次の行を使用して文字列を 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<['$*']>; ?>

これが頭を悩ませている場合は申し訳ありません-それは確かに私を悩ませています!

4

2 に答える 2

0

代わりに口ひげを使ってみるべきだと思います。

mustache.github.com

于 2012-05-10T14:42:11.070 に答える
0

ブライアンが提案したように、口ひげのような既存のものを使用する必要があります。

しかし、これは評価よりも置換を行うためのより合理的な方法です。必要なのは、好みのドット表記法解決関数を調整することだけです。

<?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 に答える