2016-10-03 44 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