PHP:如何在没有eval()的情况下解析模板表达式

时间:2017-02-21 21:46:04

标签: php parsing templates eval

我有一个包含对象和数组的复杂对象。这里发布数据对象太大了(在我的课程中定义为$ this->数据)。我还有一个简单的配置文件" {{name.something}}"模板表达式。我试图编写一个简单的表达式解析器来解析配置字符串,例如" {{patient.firstname}}"。

示例表达式:

{{patient.firstname}},{{patient-> 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 个答案:

答案 0 :(得分:1)

您可以使用花括号来获取具有变量名称的对象属性。

PHP dynamic name for object property

我认为这会取代您对 <?php $out = $this->data->{$var}; 的使用:

viewController