preg_replace 将匹配的组传递给函数奇怪的结果
preg_replace passing the matched group to a function weired result
我有以下 preg_replace
not preg_replace_callback
它不仅使用 arrays 进行搜索模式和替换一个单一的价值,它工作正常:
preg_replace(['/\{/','/\}/','/"(.*?)"/'],['<span class=\'olive\'>{','}</span>','<span class=\'olive\'>[=11=]</span>'],FoxText::insertBr($model->TafseerText));
但是,当我尝试通过 [=16=]
来实现类似的功能时:
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] => [=19=] )
而 return 值与上一次调用的匹配字符串!
也就是说,它怎么能把return$parts[0]
当成一个字符串,又不能把这个字符串炸开。或者我怎样才能将值正确地传递给要在那里处理的函数?
顺便说一下,字符串类似于 (125-Verse)
因为当您调用函数 pattern2VerseId
时,您使用 字符串 [=11=]
调用它。由于字符串 [=11=]
不包含任何连字符,因此 explode
只是 returns 一个包含字符串的单个元素的数组。
explode('-', '[=14=]') // will return Array([0] => [=14=])
"$0"
您实际上是在尝试获取匹配的正则表达式的第一部分,即本例中的 125 吗?因为你做的不对。
因为我有 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\'>[=10=]</span>'],FoxText::insertBr($model->TafseerText));
$callback = function($m){return FoxText::pattern2VerseId($m);};
echo preg_replace_callback('/\(((\d+)-(\w+))\)/u', $callback, $p);
我有以下 preg_replace
not preg_replace_callback
它不仅使用 arrays 进行搜索模式和替换一个单一的价值,它工作正常:
preg_replace(['/\{/','/\}/','/"(.*?)"/'],['<span class=\'olive\'>{','}</span>','<span class=\'olive\'>[=11=]</span>'],FoxText::insertBr($model->TafseerText));
但是,当我尝试通过 [=16=]
来实现类似的功能时:
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] => [=19=] )
而 return 值与上一次调用的匹配字符串!
也就是说,它怎么能把return$parts[0]
当成一个字符串,又不能把这个字符串炸开。或者我怎样才能将值正确地传递给要在那里处理的函数?
顺便说一下,字符串类似于 (125-Verse)
因为当您调用函数 pattern2VerseId
时,您使用 字符串 [=11=]
调用它。由于字符串 [=11=]
不包含任何连字符,因此 explode
只是 returns 一个包含字符串的单个元素的数组。
explode('-', '[=14=]') // will return Array([0] => [=14=])
"$0"
您实际上是在尝试获取匹配的正则表达式的第一部分,即本例中的 125 吗?因为你做的不对。
因为我有 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\'>[=10=]</span>'],FoxText::insertBr($model->TafseerText));
$callback = function($m){return FoxText::pattern2VerseId($m);};
echo preg_replace_callback('/\(((\d+)-(\w+))\)/u', $callback, $p);