preg_replace('/{get_(\w+)}/',$arr[$1], $content);
$1為後向引用,我需要把匹配的 \w+ 作為參數,傳入到自訂函數,或者作為數組的索引,該怎麼實現呢
回複討論(解決方案)
preg_replace_callback 可以回呼函數,但是怎麼把匹配到的,作為數組的索引,這個我找不到方法
preg_replace('/{get_(\w+)}/e','$arr["$1"]', $content);
$content = '{get_abc}';$arr['abc'] = 123;echo preg_replace('/{get_(\w+)}/e', '$arr["$1"]', $content);
擴充模式 e 表示 eval,表示將第二個參數當做 php 語句來執行
不過這種做法到了 php5.5 就廢止了,因為動態解釋 php 語句存在效率和安全的問題
合理的做法是使用 preg_replace_callback
下面開列 3 中寫法
$content = '{get_abc}';$arr['abc'] = 123;echo preg_replace_callback('/{get_(\w+)}/', 'back', $content);function back($m) { global $arr; return $arr[$m[1]];}
$content = '{get_abc}';$arr['abc'] = 123;echo preg_replace_callback('/{get_(\w+)}/', create_function('$m', 'global $arr; return $arr["$m[1]"];'), $content);
$content = '{get_abc}';$arr['abc'] = 123;echo preg_replace_callback('/{get_(\w+)}/', function($m) use($arr) { return $arr["$m[1]"];}, $content);顯然第 3 種寫法最清晰,但只在 php5.3 才開始支援