2017-02-21 2 views
0

私はオブジェクトと配列の両方を持つ複雑なオブジェクトを持っています。データオブジェクトをここに投稿するには大きすぎます(クラス内に$ this-> dataとして定義されています)。私はシンプルな "{{name.something}}"テンプレート式を持つ設定ファイルも持っています。私は、 "{{patient.firstname}}"のような構成文字列を解析するための簡単な式パーサーを作成しようとしています。PHP:eval()を使わずにテンプレート式を解析する方法

例式:

{{patient.firstname}}、{{た患者> FIRSTNAME}}あるいは{{patient.customfields [0] .customfieldvalue}}

以下のコードはように思われますうまくできた。今私はそれが働いている、私はeval()関数の使用法と安全性に疑問を呈しています。設定ファイルにはユーザーが入力したデータは含まれていません。このコードは安全ですか? eval()を使わないでこれを書き直す方法はありますか?

<?php 
// Note - This is only part of the class. 

/* 
* Parse Template Value Expressions 
* Allows complex object data to be used. Examples: 
* {{patient.firstname}}, {{patient->firstname}} or even {{patient.customfields[0].customfieldvalue}} 
*/ 
private function _parseDataValue($value = '') { 

    // Parse Template Expressions: Allows data input to be used {{name}}, {{name1.name2}}, etc 
    if ($value != '' && preg_match('/\{\{([a-z0-9\-_\[\]\>\.]+)\}\}/i', trim($value))) { 
     $value = preg_replace_callback('/\{\{([a-z0-9\-_\[\]\>\.]+)\}\}/i', 
       array(&$this, '_buildDataCallback'), trim($value)); 
    } 
    return $value; 
} 

/* 
* Parse Template Value Expressions Callback Method 
*/ 
private function _buildDataCallback($matches) { 

    $out = ''; 
    if (isset($matches[1])) { 
     $var = $matches[1]; 
     @eval("\$out = \$this->data->$var;"); 
    } 
    return $out; 
} 

?> 

答えて

1

中カッコを使用すると、変数名を持つオブジェクトのプロパティを取得できます。

PHP dynamic name for object property

私はこれがeval()のご使用を置き換えるだろうと思う:

<?php 
    $out = $this->data->{$var}; 
+0

エラーがスローされます。 $ varは、patient.firstname、patient-> firstname、patient.customfields [0] .customfieldvalueなどの複雑な式にすることができます。 – jjwdesign

関連する問題