2013-05-08 116 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