Ersättning med callback via reguljära uttryck i PHP
Låt oss säga att vi har följande sträng:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Låt oss säga att vi behöver hitta alla konstruktioner av typen tal+tal= och göra så att resultatet av additionen visas efter likhetstecknet.
För att lösa en sådan uppgift är det bekvämt att använda
funktionen preg_replace_callback, som
fungerar på samma sätt som funktionen preg_replace
- hittar och ersätter med ett reguljärt uttryck,
men möjliggör ytterligare manipulationer
med de hittade delarna.
Den första parametern tar emot det reguljära uttrycket, den andra - vad vi ska ersätta med, den tredje - strängen där ersättningen sker.
I den andra parametern ska man skicka en callback-funktion, som kommer att anropas för varje funnet match.
Den första parametern i callback-funktionen ska vara en variabel som de hittade delarna kommer att hamna i. Denna variabel kommer att vara en array med fångade grupper från matchningen.
Låt oss prova i praktiken. Låt oss skriva kod som fångar våra delsträngar, samtidigt som det första talet läggs i den första fångstgruppen och det andra - i den andra:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Som ett resultat kommer vår var_dump att fungera
tre gånger, och visa följande i tur och ordning:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Vi går vidare. Varje match kommer att ersättas
med det som callback-funktionen returnerar via return.
Låt oss som ett exempel ersätta var och en av de sökta
delsträngarna med tecknet '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // skriver ut '! ! !'
?>
Och låt oss nu ersätta varje delsträng med summan av talparet 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; // skriver ut '5 8 13'
?>
Det visar sig att vår uppgift nästan är löst. Det återstår bara att se till att den sökta delsträngen finns kvar framför summan. För att göra detta kommer vi att infoga innehållet i den nollte fångstgruppen framför summan:
<?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; // skriver ut '2+3=5 3+5=8 7+8=13'
?>
Given en sträng:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Ersätt alla tal i strängen med deras kvadrater.
Förväntat resultat:
'The numbers are 9, 49 and 144'
Given en sträng:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Omvandla alla datum till formatet dag.månad.år.
Given en sträng:
<?php
$str = 'Costs: $15, $20, $100';
?>
Öka alla priser med 10%.