preg_replace将匹配的组传递给函数weired result

时间:2016-10-03 15:05:55

标签: php regex pcre

我有以下preg_replace preg_replace_callback,其中数组用于搜索模式,并且不仅替换单个值,而且工作正常:

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)

2 个答案:

答案 0 :(得分:0)

因为当您调用函数pattern2VerseId时,您可以使用字符串 $0来调用它。由于字符串$0不包含任何连字符,explode只返回一个包含字符串的单个元素的数组。

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

"\$0"你真的试图获得匹配的正则表达式的第一部分,即在这种情况下是125吗?因为你做得不对。

答案 1 :(得分:0)

因为我有PHP&lt; 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);