我有以下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)
答案 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);