16

{{key}}のアイテムを$text渡された配列の値に置き換えようとしています。print_rしかし、何が起こっているのかを確認するために を追加しようとすると、Undefined variable: kvPairsエラーが発生しました。内で自分の変数フォームにアクセスするにはどうすればよいpreg_replace_callbackですか?

public function replaceValues($kvPairs, $text) {
    $text = preg_replace_callback(
        '/(\{{)(.*?)(\}})/',
        function ($match) {
            $attr = trim($match[2]);
            print_r($kvPairs[strtolower($attr)]);
            if (isset($kvPairs[strtolower($attr)])) {
                return "<span class='attr'>" . $kvPairs[strtolower($attr)] . "</span>";
            } else {
                return "<span class='attrUnknown'>" . $attr . "</span>";
            }
        },
        $text
    );
    return $text;
}

アップデート:

スコープを試してみましたが、globalどちらも機能しません。で何が行われているかを確認するために、2 つの print ステートメントを追加しましたpreg_replace_callback

public function replaceValues($kvPairs, $text) {
    $attrTest = 'date';
    print_r("--" . strtolower($attrTest) . "--" . $kvPairs[strtolower($attrTest)] . "--\n");
    $text = preg_replace_callback(
        '/(\{{)(.*?)(\}})/',
        function ($match) {
            global $kvPairs;
            $attr = trim($match[2]);
            print_r("==" . strtolower($attr) . "==" . $kvPairs[strtolower($attr)] . "==\n");
            if (isset($kvPairs[strtolower($attr)])) {
                return "<span class='attr'>" . $kvPairs[strtolower($attr)] . "</span>";
            } else {
                return "<span class='attrUnknown'>" . $attr . "</span>";
            }
        },
        $text
    );
    return $text;
}

私が得る出力は次のとおりです。

--date--1977-05-20--
==date====
4

1 に答える 1

48

コールバック関数はクロージャーであるため、追加の引数を渡すことができますuse

function ($match) use ($kvPairs) {
    ...
}

地球空間を汚染するよりはマシ

于 2013-05-08T16:52:54.733 に答える