RegEx:Backreferences
OsiriS
- php
0 Tom0 OsiriS
0 André Laugks0 OsiriS
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
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
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
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
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
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