1

私がこの配列を持っているとしましょう:

$meta = array(
    'name' => 'John Doe',
    'age' => 16,
    'e-mail' => 'john.doe@doedoe.com'
);

ユーザーがこれらの変数を使用してレイアウトをカスタマイズできるようにするにはどうすればよいですか?(そしてエラーをキャッチすることができます)。これが私の現在の考えです:

extract($meta,EXTR_OVERWRITE);
$string = "Hi, I am $name. This is an $undefined_variable";

ただし、未定義の変数をキャッチすることはできません。

4

2 に答える 2

3

これはどう?

$string = "Hi, I am {{name}}. This is an {{undefined_variable}}";
foreach ($meta as $key => $value) {
    $string = str_replace('{{' . $key . '}}', $value, $string);
}

{{name}}または、などをキーとして直接持つことができる場合は、次のようにします$meta

$string = "Hi, I am {{name}}. This is an {{undefined_variable}}";
$string = str_replace(array_keys($meta), array_values($meta), $string);

または、元のキーに配置できない場合は、キー$metaを使用してキーを作成してキャッシュすることができます。{{...}}

$metaTokens = array();
foreach ($meta as $key => $value) {
    $metaTokens['{{' . $key . '}}'] = $value;
}

次に、未定義の変数を単純に非表示にする場合は、定義済みの変数をすべて入力する必要があるため、内部の他の変数はすべて{{..}}未定義の変数になります。

$string = preg_replace('/{{.+?}}/', '', $string);
于 2012-07-15T13:20:37.443 に答える
0

この記事に基づいて、テンプレートクラスを作成できます(私は魔法のメソッドを避けようとしています)。

class Template 
{
    protected $parameters  = array();
    protected $filename = null;

    public function __construct( $filename )
    {
        $this->filename = $filename;
    }

    public function bind($name, $value) 
    {
        $this->parameters[$name] = $value;
    }

    public function render() 
    {
        extract( $this->parameters );
        error_reporting(E_ALL ^ E_NOTICE);
        ob_start();
        include( $this->filename );
        error_reporting(~0); // -1 do not work on OSX
        return ob_get_clean();
    }

}

基本的に、出力をレンダリングする直前に警告を無効にしてから、再度有効にします。これにより、一部の変数が定義されていない場合でも、ファイルをレンダリングできます。

于 2012-07-15T13:27:35.767 に答える