2016-10-03 76 views
0

我有以下preg_replacepreg_replace_callback其使用陣列用於搜索模式和更換不僅單個值和正常工作:preg_replace函數使所述匹配組的功能weired結果

preg_replace(['/\{/','/\}/','/"(.*?)"/'],['<span class=\'olive\'>{','}</span>','<span class=\'olive\'>${0}</span>'],FoxText::insertBr($model->TafseerText)); 

然而當我試圖通過${0}的功能是這樣的:

preg_replace(['/\{/','/\}/','/"(.*?)"/'],['<span class=\'olive\'>{','}</span>',FoxText::pattern2VerseId("\$0")],FoxText::insertBr($model->TafseerText)); 

FoxText::pattern2VerseId功能我嘗試print_r如下:

public static function pattern2VerseId($txt, $pattern = '/\(((\d+)-(\w+))\)/u') 
{ 
    $parts = array_map('trim',explode('-', $txt)); 
    print_r(explode('-', $parts[0])); 
    return $parts[0].' *'.$parts[0].'|'; 
} 

它打印Array ([0] => $0)而返回值從以前的調用匹配的字符串!

換句話說,它怎麼能夠將$parts[0]作爲一個字符串返回並且它無法爆炸這個字符串。或者我怎樣才能正確地將值傳遞給待處理的函數?

順便說一句,該字符串是一樣的東西(125-Verse)

+0

可能的唯一的解決方案重複使用preg \ _replace \ _callback]替換preg \ _replace()e修飾符(http://stackoverflow.com/questions/15454220/replace-preg-replace-e-modifier-with-preg-replace-callback) – revo

回答

0

由於我必須PHP < 7.即不存在preg_replace_callback_array,我有能夠使用正在取代使用preg_replace然後使輸出的第一圖案(多個)到一個preg_replace_callback

$p = preg_replace(['/\{/','/«/','/\(/','/\}/','/»/','/\)/','/"(.*?)"/'],['<span class=\'olive\'>{','<span class=\'olive\'>«','<span class=\'olive\'>(','}</span>','»</span>',')</span>','<span class=\'olive\'>${0}</span>'],FoxText::insertBr($model->TafseerText)); 
$callback = function($m){return FoxText::pattern2VerseId($m);}; 
echo preg_replace_callback('/\(((\d+)-(\w+))\)/u', $callback, $p); 
0

因爲當你調用函數pattern2VerseId你與$0調用它。由於字符串$0不包含任何連字符,explode只返回一個包含字符串的單個元素的數組。

explode('-', '$0') // will return Array([0] => $0)

通過"\$0"你實際上是試圖獲得匹配的正則表達式的第一部分,即,在這種情況下,125?因爲你做得不對。

+0

你是什​​麼意思,我做得不對? – SaidbakR

+0

我的意思是你認爲你傳遞了匹配的部分,但實際上你只是傳遞字符串'$ 0'。 – mavili