Erstatning med tilbakekall via regulære uttrykk i PHP

La oss si at vi har følgende streng:

php<?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<?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:

php['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<?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<?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<?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'
?>
Задание 1

Gitt en streng:

php<?php
  $str = 'The numbers are 3, 7 and 12';
?>

Erstatt alle tall i strengen med deres kvadrater.

Forventet resultat:

php'The numbers are 9, 49 and 144'
Задание 2

Gitt en streng:

php<?php
  $str = '2023-01-15 2022-12-31 2024-05-20';
?>

Transformer alle datoer til formatet dag.måned.år.

Задание 3

Gitt en streng:

php<?php
  $str = 'Costs: $15, $20, $100';
?>

Øk alle priser med 10%.