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 に答える