Erstatning med tilbakekall via regulære uttrykk i PHP
La oss si at vi har følgende streng:
<?php
$str = '2+3= 3+5= 7+8=';
?>
La oss si at vi trenger å finne alle konstruksjoner av typen tall+tall= og gjøre slik at resultatet av addisjonen vises etter likhetstegnet.
For å løse en slik oppgave er det praktisk å bruke
funksjonen preg_replace_callback, som
fungerer på samme måte som funksjonen preg_replace
- finner og erstatter ved hjelp av et regulært uttrykk,
men tillater å utføre ytterligere manipulasjoner
med de funnete delene.
Den første parameteren funksjonen tar imot er det regulære uttrykket, den andre - hva vi erstatter med, den tredje - strengen der erstatningen utføres.
I den andre parameteren bør man sende en tilbakekallsfunksjon, som vil bli kalt for hvert funnet treff.
Den første parameteren i tilbakekallet må spesifiseres en variabel som de funne resultatene vil havne i. Denne variabelen vil være en matrise av fangete grupper fra det funnete.
La oss prøve i praksis. La oss skrive kode som fanger våre delstrenger, samtidig som det første tallet puttes i den første fangergruppen, og det andre - i den andre:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Som et resultat vil vår var_dump
kjøre tre ganger, og vise følgende etter hverandre:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Vi går videre. Hvert treff vil bli erstattet
med det som tilbakekallet returnerer via return.
La oss for eksempel erstatte hver av de søkte
delstrengene 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 la oss nå erstatte hver delstreng med summen av tallparet 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 seg at oppgaven vår nesten er løst. Det gjenstår å gjøre slik at den søkte delstrengen forblir foran summen av tallene. For å gjøre dette vil vi sette innholdet av den nullte fangergruppen 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'
?>
Gitt en streng:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Erstatt alle tall i strengen med deres kvadrater.
Forventet resultat:
'The numbers are 9, 49 and 144'
Gitt en streng:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Transformer alle datoer til formatet dag.måned.år.
Gitt en streng:
<?php
$str = 'Costs: $15, $20, $100';
?>
Øk alle priser med 10%.