Jonny 5: preg_replace Problem

Beitrag lesen

Hallo mixmastertobsi,

Kannst Du mal bitte ein Beispiel machen, wie es in meinem Beispiel aussehen müsste?

Da du ja ersetzen möchtest (nicht nur die äußerste Ebene finden), wird preg_replace mit einem rekursiven regex nicht ausreichen. Das rekursive Suchmuster ermöglicht es, die äusserste Ebene zu finden, es ist aber afaik nicht möglich, in jedem Selbstaufruf mit dem captured match zu ersetzen.

1.) Nun könntest du per preg_replace_callback (siehe Beispiel) von aussen nach innen auflösen.

function parse_recursive($inp)
{
  if (is_array($inp))
    $inp = '<div class="quote">'.$inp[1].'</div>';

  return preg_replace_callback('/{{((?>[^}{]+|(?R))*)}}/', 'parse_recursive', $inp);
}

Hier ein Beispiel auf eval.in und das Suchmuster auf regex101 zum probieren.

2.) Oder wie schon angesprochen per preg_replace und while von innen nach aussen.

$regx = '/{{([^}{]+)}}/'; $repl = '<div class="quote">$1</div>';

while(($tmp = preg_replace($regx, $repl, $str)) !== $str) $str = $tmp;

Noch ein Beispiel auf eval.in

Würde eher zu Variante 2 tendieren. Viel Erfolg, Robert