【问题标题】:preg_replace passing the matched group to a function weired resultpreg_replace 将匹配的组传递给函数 weired 结果
【发布时间】:2016-10-03 15:05:55
【问题描述】:

我有以下 preg_replace not preg_replace_callback 使用 arrays 搜索模式和替换不仅单个值而且它工作正常:

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] =&gt; $0 ),而返回值与上一次调用的字符串匹配!

换句话说,它如何能够将$parts[0] 作为字符串返回,并且它无法分解该字符串。或者我怎样才能正确地将值传递给要在那里处理的函数?

顺便说一句,字符串类似于(125-Verse)

【问题讨论】:

标签: php regex pcre


【解决方案1】:

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

explode('-', '$0') // will return Array([0] =&gt; $0)

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

【讨论】:

  • 我的意思是你认为你传递了匹配的部分,但实际上你只是传递了字符串$0
【解决方案2】:

由于我的 PHP 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多