如何访问preg_replace_callback中的变量?

时间:2013-05-08 16:47:09

标签: php preg-replace-callback

我尝试使用传递的数组中的值替换{{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个打印语句,以查看正在进行的操作,一个在内部,一个在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====

1 个答案:

答案 0 :(得分:41)

由于你的回调函数是一个闭包,你可以通过use

传递额外的参数
function ($match) use ($kvPairs) {
    ...
}

比污染全球空间更好