OsiriS: RegEx:Backreferences

Guten Morgen, alle zusammen.

Ich sitze hier bereits seit Stunden über einem Problem, von dem ich nicht einmal genau weiß, ob es lösbar ist.

Die Aufgabenstellung:
Ich möchte in einem String mehrere Vorkommen eines Patterns bearbeiten.
Der RegEx liefert mir eine/mehrere Backreferences, die ich allerdings noch auswerten will. Das mache ich über einen Funktionsaufruf.
Falls mir nicht zu folgen ist, hier mal das Ganze in abgespecktem php-Code:

  
<?php  
$string='Hier steht etwas in [tag1]einem Tag[/tag1].'  
  
function tu_was($backres)  
  {  
  return $backres;  
  }  
  
$ausgabe=preg_replace('#\[tag1\](.+?)\[/tag1\]#is', tu_was('\\1'), $string);  
echo $ausgabe;  
?>  

Was mir eben dabei auffällt: Die Backreference ('\1') wird beim Übergeben als Parameter nicht interpretiert, sondern als String übergeben. Folglich wird folgendes ausgeführt:

  
<?php  
  echo tu_was('\\1');  
  //Ausgabe: \\1  
?>  

Kann mir jemand sagen, ob dieses Ansinnen überhaupt zu einer erfolgreichen Lösung gebracht werden kann, oder was ich gegebenen Falles falsch mache?

mit freundlichen Grüßen,
OsiriS

  1. Hello und guten Morgen,

    ich kann nicht wirklich verstehen, was Du eigentlich vor hast?
    Willst Du nicht eigentlich die beiden Tags ersetzen, die Du Dir selber gebaut hast?

    Dann  müsstest Du Die mal die Lösaung mit dem Array anschauen:
    http://www.php.net/manual/en/function.preg-replace.php

    Example #2 Using indexed arrays with preg_replace()

    <?php
        $string = 'The quick brown fox jumped over the lazy dog.';

    $patterns[0] = '/quick/';
        $patterns[1] = '/brown/';
        $patterns[2] = '/fox/';
        $replacements[2] = 'bear';
        $replacements[1] = 'black';
        $replacements[0] = 'slow';

    echo preg_replace($patterns, $replacements, $string);
    ?>

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Tut mir Leid, ich fürchte, du hast mich missverstanden.

      Aber ich habe die Passende Antwort bereits erhalten (siehe Thread weiter oben )

      Trotzdem Danke für deine Hilfe.
      OsiriS

  2. Hallo!

    Die Aufgabenstellung:
    Ich möchte in einem String mehrere Vorkommen eines Patterns bearbeiten.
    Der RegEx liefert mir eine/mehrere Backreferences, die ich allerdings noch auswerten will. Das mache ich über einen Funktionsaufruf.

    Verwende die Funktion preg_replace_callback.

    Viele Grüße

    André Laugks

    1. Vielen Dank, das ist genau, was ich brauchte.

      Auf den ersten Blick ist diese Funktion etwas verwirrend, vor allem der Aufruf der Callbackfunktion als String, aber es funktioniert.

      Danke,
      OsiriS

      1. Hallo!

        Auf den ersten Blick ist diese Funktion etwas verwirrend, vor allem der Aufruf der Callbackfunktion als String, aber es funktioniert.

        Der Aufruf innerhalb einer Klasse würde so aussehen:

        class foo {  
          
           public function bar($string) {  
              return preg_replace_callback('/[\d]/', array(&$this, 'myCallbackFunction'), $string);  
           }  
          
           // muß nicht private sein  
           private function myCallbackFunction($match) {  
              // tue was  
           }  
          
        }
        

        André Laugks