Vervanging met callback via reguliere expressies in PHP
Stel dat we de volgende string hebben:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Stel dat we alle constructies van het type getal+getal= moeten vinden en ervoor moeten zorgen dat er na het gelijkteken het resultaat van de optelling verschijnt.
Voor de oplossing van een dergelijk probleem is het handig om gebruik te maken
van de functie preg_replace_callback, die
analoog werkt aan de functie preg_replace
- vindt en vervangt volgens een reguliere expressie,
maar maakt extra manipulaties mogelijk
met de gevonden stukjes.
De eerste parameter van de functie accepteert de reguliere expressie, de tweede - waar we naar vervangen, de derde - de string waarin de vervanging plaatsvindt.
Hierbij moet in de tweede parameter een callback-functie worden doorgegeven, die voor elk gevonden match wordt aangeroepen.
De eerste parameter van de callback moet een variabele zijn waarin de gevonden match terechtkomt. Deze variabele zal een array zijn van de gevonden captures (groepen).
Laten we het in de praktijk proberen. We schrijven code die onze substrings zal vangen, waarbij het eerste getal in de eerste capture komt te zitten, en het tweede - in de tweede:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Als resultaat zal onze var_dump
drie keer worden uitgevoerd, en achtereenvolgens het volgende tonen:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
We gaan verder. Elke match wordt vervangen
door wat de callback teruggeeft via return.
Laten we voor de demonstratie elk van de gezochte
substrings vervangen door het teken '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // toont '! ! !'
?>
En laten we nu elke substring vervangen door de som van het getallenpaar erin:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // toont '5 8 13'
?>
Het blijkt dat onze taak bijna opgelost is. We hoeven alleen nog maar te regelen dat voor de som van de getallen de gezochte substring blijft staan. Hiervoor zullen we voor de som de inhoud van de nulde capture plaatsen:
<?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; // toont '2+3=5 3+5=8 7+8=13'
?>
Gegeven een string:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Vervang alle getallen in de string door hun kwadraten.
Verwacht resultaat:
'The numbers are 9, 49 and 144'
Gegeven een string:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Converteer alle data naar het formaat dag.maand.jaar.
Gegeven een string:
<?php
$str = 'Costs: $15, $20, $100';
?>
Verhoog alle prijzen met 10%.