2013-05-08 22 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スコープの事を試してみたが、それはどちらか動作しません。 preg_replace_callbackの内側と外側の2つのprint文を追加しました。

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) { 
    ... 
} 
01で余分な引数を渡すことができます

グローバルスペースを汚染するよりも良い

+0

次の一致のために$ kvPairsを操作したいと思いますか、それともグローバル変数が必要ですか? – Wikunia

+4

コールバック内で '$ kvPairs'を操作する必要がある場合は、___by reference___を渡します:' function($ match)use(&$ kvPairs){ ... } ' –

-1

$kvPairsがあなたのコールバック関数内で範囲外である、あなたのコールバック関数が閉鎖されたようグローバル

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

これはうまくいきません – Justin808

関連する問題