私はオブジェクトと配列の両方を持つ複雑なオブジェクトを持っています。データオブジェクトをここに投稿するには大きすぎます(クラス内に$ 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;
}
?>
エラーがスローされます。 $ varは、patient.firstname、patient-> firstname、patient.customfields [0] .customfieldvalueなどの複雑な式にすることができます。 – jjwdesign