Erstatning med callback via regulære udtryk i PHP
Lad os sige, at vi har følgende streng:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Lad os sige, at vi skal finde alle konstruktioner af typen tal+tal= og gøre sådan, at der efter lighedstegnet vises resultatet af additionen.
For at løse en sådan opgave er det praktisk at bruge
funktionen preg_replace_callback, som
virker på samme måde som funktionen preg_replace
- finder og erstatter via et regulært udtryk,
men tillader at udføre yderligere manipulationer
med de fundne stykker.
Den første parameter, funktionen accepterer, er det regulære udtryk, den anden - hvad vi erstatter med, den tredje - strengen, hvor erstatningen udføres.
I dette tilfælde skal den anden parameter sendes en callback-funktion, som vil blive kaldt for hver fundne match.
Som den første parameter for callback'en skal du angive en variabel, som det fundne vil blive placeret i. Denne variabel vil være et array med lommer (capturing groups) af det fundne.
Lad os prøve det i praksis. Lad os skrive koden, som vil fange vores understrenge, samtidig med at det første tal lægges i den første lomme, og det andet - i den anden:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Som et resultat vil vores var_dump
køre tre gange og vise følgende efter tur:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Lad os gå videre. Hvert match vil blive erstattet
med det, som callback'en returnerer via return.
Lad os for eksemplets skyld erstatte hver af de søgte
understrenge med tegnet '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // vil vise '! ! !'
?>
Og lad os nu erstatte hver understreng med summen af talparret i den:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // vil vise '5 8 13'
?>
Det viser sig, at vores opgave næsten er løst. Det eneste, der mangler, er at gøre sådan, at den søgte understreng forbliver foran summen af tallene. For at gøre dette vil vi indsætte indholdet af den nulte lomme foran summen:
<?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; // vil vise '2+3=5 3+5=8 7+8=13'
?>
Der er givet en streng:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Erstat alle tal i strengen med deres kvadrater.
Forventet resultat:
'The numbers are 9, 49 and 144'
Der er givet en streng:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Konverter alle datoer til formatet dag.måned.år.
Der er givet en streng:
<?php
$str = 'Costs: $15, $20, $100';
?>
Forøg alle priser med 10%.