Ersetzung mit Callback über reguläre Ausdrücke in PHP
Nehmen wir an, wir haben die folgende Zeichenkette:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Nehmen wir an, wir müssen alle Konstrukte der Form Zahl+Zahl= finden und dafür sorgen, dass nach dem Gleichheitszeichen das Ergebnis der Addition erscheint.
Um solche Aufgaben zu lösen, ist es praktisch,
die Funktion preg_replace_callback zu verwenden, die
ähnlich wie die Funktion preg_replace funktioniert
- sie findet und ersetzt mittels regulärem Ausdruck,
erlaubt aber zusätzliche Manipulationen
mit den gefundenen Teilen.
Der erste Parameter der Funktion ist der reguläre Ausdruck, der zweite - der Ersatz, der dritte - die Zeichenkette, in der die Ersetzung durchgeführt wird.
Dabei sollte im zweiten Parameter eine Callback-Funktion übergeben werden, die für jedes gefundene Vorkommen aufgerufen wird.
Als ersten Parameter des Callbacks muss man die Variable angeben, in die das Gefundene gelangt. Diese Variable wird ein Array der erfassten Gruppen (Capturing Groups) des Gefundenen sein.
Probieren wir es in der Praxis. Schreiben wir Code, der unsere Teilzeichenketten findet und dabei die erste Zahl in der ersten Gruppe und die zweite - in der zweiten Gruppe speichert:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Infolgedessen wird unser var_dump
drei Mal ausgeführt und nacheinander Folgendes ausgeben:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Weiter. Jedes Vorkommen wird ersetzt
durch das, was der Callback via return zurückgibt.
Ersetzen wir zum Beispiel jede der gesuchten
Teilzeichenketten durch das Zeichen '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // gibt '! ! !' aus
?>
Und jetzt ersetzen wir jede Teilzeichenkette durch die Summe der Zahlenpaare darin:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // gibt '5 8 13' aus
?>
Damit ist unsere Aufgabe fast gelöst. Es bleibt nur noch dafür zu sorgen, dass vor der Summe der Zahlen die gesuchte Teilzeichenkette erhalten bleibt. Dazu fügen wir vor der Summe den Inhalt der Gruppe 0 (null) ein:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[0] . ($match[1] + $match[2]);
}, $str);
echo $res; // gibt '2+3=5 3+5=8 7+8=13' aus
?>
Gegeben sei die Zeichenkette:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Ersetzen Sie alle Zahlen in der Zeichenkette durch ihre Quadrate.
Erwartetes Ergebnis:
'The numbers are 9, 49 and 144'
Gegeben sei die Zeichenkette:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Konvertieren Sie alle Daten in das Format Tag.Monat.Jahr.
Gegeben sei die Zeichenkette:
<?php
$str = 'Costs: $15, $20, $100';
?>
Erhöhen Sie alle Preise um 10%.