0

我有一个模板,其中包含某些要替换为给定值的字段。

每个字段都有一个用大括号括起来的名称。例如: {address} 替换值包含在索引为名称的数组中。例如array('address'=>'101 Main Street', 'city’=>'New York')

我正在使用以下内容,并且效果很好(大多数情况下)

$template_new= preg_replace('/\{\?(\w+)\?\}/e', '$array["$1"]', $template);

问题是如果我有一个{bad_name}不在数组中,我会收到以下错误:

注意:未定义的索引: /var/www/classes/library.php(860) 中的 xxx:第1行 的正则表达式代码

我的愿望是将这些留在原处而不改变它们。

我的第一个想法是替换$array["$1"](isset($array["$1"])?$array["$1"]': '{'.$1.'}'),但它没有用。

我也试过try/catch,但也没有用

请提供任何建议。谢谢

4

1 回答 1

3

使用preg_replace_callback()并执行以下操作会更好:

<?php
class Substitute {

    public function __construct($template) {
        $this->template = $template;
        $this->values = array();
    }

    public function run($values) {
        $this->values = $values;
        return preg_replace_callback('/\{\?(\w+)\?\}/', array($this, 'subst'), $this->template);
    }

    private function subst($matches) {
        if (isset($this->values[$matches[1]])) {
            return $this->values[$matches[1]];
        }
        // Don't bother doing the substitution.
        return $matches[0];
    }
}

请记住,我是在脑海中输入的,所以可能存在错误。

假设您能够使用匿名函数,以下是您如何使用匿名函数执行相同操作的方法:

function substitute($template, $values) {
    return preg_replace_callback(
        '/\{\?(\w+)\?\}/',
        function ($matches) use ($values) {
            if (isset($values[$matches[1]])) {
                return $values[$matches[1]];
            }
            // Don't bother doing the substitution.
            return $matches[0];
        },
        $template);
}

更紧凑!

于 2012-11-29T22:33:00.947 回答