PHP'de Düzenli İfadeler ile Geri Çağırım Kullanarak Değiştirme
Diyelim ki aşağıdaki dizgimiz var:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Diyelim ki sayı+sayı= şeklindeki tüm yapıları bulmamız ve eşittir işaretinden sonra toplama sonucunun görünmesini sağlamamız gerekiyor.
Böyle bir problemi çözmek için preg_replace_callback
fonksiyonunu kullanmak uygundur. Bu fonksiyon,
preg_replace fonksiyonuna benzer şekilde çalışır
- düzenli ifadeye göre bulur ve değiştirir,
ancak bulunan parçalarla ek işlemler yapmamıza
olanak tanır.
Fonksiyon ilk parametre olarak düzenli ifadeyi, ikinci parametre olarak neyle değiştireceğimizi, üçüncü parametre olarak da değişikliğin yapılacağı dizgiyi alır.
Ancak, ikinci parametreye, her bulunan eşleşme için çağrılacak bir geri çağırım fonksiyonu iletilmelidir.
Geri çağırımın ilk parametresi olarak, bulunanın içine gireceği değişkeni belirtmeliyiz. Bu değişken, bulunanın yakalama gruplarını içeren bir dizi olacaktır.
Pratikte deneyelim. Alt dizgilerimizi yakalayan, ilk sayıyı birinci yakalama grubuna, ikinci sayıyı ise ikinci yakalama grubuna koyan bir kod yazalım:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Sonuç olarak var_dump'umuz üç kez çalışacak
ve sırasıyla aşağıdakileri gösterecektir:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Devam edelim. Her bir eşleşme, geri çağırımın
return ile döndürdüğü şeyle değiştirilecektir.
Örnek olarak, aranan her bir alt dizgiyi
'!' işaretiyle değiştirelim:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // '! ! !' yazdıracak
?>
Şimdi de her bir alt dizgiyi, içindeki sayı çiftinin toplamıyla değiştirelim:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // '5 8 13' yazdıracak
?>
Görünüşe göre problemimiz neredeyse çözüldü. Geriye kalan, sayıların toplamının önünde aranan alt dizginin kalmasını sağlamak. Bunun için sıfırıncı yakalama grubunun içeriğini toplamın önüne yerleştireceğiz:
<?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; // '2+3=5 3+5=8 7+8=13' yazdıracak
?>
Bir dizgi verildi:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Dizgideki tüm sayıları kareleriyle değiştirin.
Beklenen sonuç:
'The numbers are 9, 49 and 144'
Bir dizgi verildi:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Tüm tarihleri gün.ay.yıl formatına dönüştürün.
Bir dizgi verildi:
<?php
$str = 'Costs: $15, $20, $100';
?>
Tüm fiyatları %10 artırın.