2013-05-08 117 views
9

我试图用$text中的{{key}}项替换传递数组中的值。但是当我尝试添加print_r以查看发生了什么时,我得到了一个Undefined variable: kvPairs错误。如何在preg_replace_callback内访问我的变量表单?如何访问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==== 

回答

35

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

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

好于污染全球空间

+0

我想操纵$ kvPairs进行下一场比赛,是否可能或者我需要一个全局变量吗? – Wikunia 2014-08-26 11:33:36

+4

如果您需要在回调中操作'$ kvPairs',那么您可以通过参考____:'function($ match)use(&$ kvPairs){ ... } – 2014-08-26 11:36:22

-1

$kvPairs超出范围在回调函数,声明它作为一个全球性的

function($match) { 
    global $kvPairs; 
    ... 
} 
+0

这不起作用 – Justin808 2013-05-08 16:58:42