preg 替换以匹配最接近的模式

preg replace to match the closest pattern

我有以下字符串

$message = "[quote=azerty]ce que je comprend pas c'est pourquoi j'ai due m'inscrire sur MQL5 ? [/quote]
C'est valable pour le système de signaux dans son ensemble, donc MT4 et MT5
[quote=azerty]si je mets le signal public ça change quoi ? [/quote]
Tu dois surtout mettre ton signal en gratuit, sinon tu devras payer pour suivre tes trades."

我正在使用下面的代码来匹配

callback_function($match) {
    return "$match[1] wrote: <blockquote class='uncited'><p>$match[2]</p></blockquote>";
}

 $str = preg_replace_callback("/\[quote=\"([^\"]+)\"\](.*?)\[\/quote\]/is", "callback_function", $message);

它与第 4 次匹配,而不是将第 1 次出现的 quote 与第 2 次匹配。 有什么办法可以改变这个吗?

您的代码中可能会更正的一些内容:

  1. 您正在尝试匹配 [quote] 标签中的引用文本,但 [quote=azerty] 中没有双引号。因此,您的模式的这一部分永远不会匹配:\"([^\"]+)\".
    我们可以把它改成([^\]]+),来匹配除].
  2. 以外的任何字符
  3. 这里不需要使用回调,因为您不是在替换之前评估匹配。只需使用 preg_replace().

代码:

$pattern = '/\[quote=([^\]]+)\](.*?)\[\/quote\]/is';
$replacement = " wrote: <blockquote class='uncited'><p></p></blockquote>";
$str = preg_replace($pattern, $replacement, $message);

ideone demo