Penggantian dengan Callback melalui Regex dalam PHP
Katakan kita mempunyai rentetan berikut:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Katakan kita perlu mencari semua konstruksi seperti nombor+nombor= dan menjadikannya supaya hasil tambah muncul selepas tanda sama dengan.
Untuk menyelesaikan masalah seperti ini, adalah mudah untuk menggunakan
fungsi preg_replace_callback, yang
berfungsi sama seperti fungsi preg_replace
- mencari dan menggantikan berdasarkan ungkapan biasa,
tetapi membolehkan manipulasi tambahan dilakukan
serpihan yang ditemui.
Parameter pertama fungsi menerima regex, parameter kedua - dengan apa untuk menggantikan, parameter ketiga - rentetan di mana penggantian dilakukan.
Pada masa yang sama, ke parameter kedua harus diserahkan fungsi callback, yang akan dipanggil untuk setiap padanan yang ditemui.
Parameter pertama callback perlu dinyatakan pembolehubah di mana yang ditemui akan dimasukkan. Pembolehubah ini akan menjadi array subpattern (capturing group) yang ditemui.
Mari cuba dalam praktik. Tulis, kod, yang akan menangkap substring kami, pada masa yang sama meletakkan nombor pertama dalam subpattern pertama, dan yang kedua - dalam subpattern kedua:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Hasilnya, var_dump kami akan berfungsi
tiga kali, secara berurutan mencetak yang berikut:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Kita teruskan. Setiap padanan akan digantikan
dengan apa yang dikembalikan oleh callback melalui return.
Mari sebagai contoh gantikan setiap
substring yang dicari dengan tanda '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // akan mencetak '! ! !'
?>
Dan sekarang gantikan setiap substring dengan hasil tambah pasangan nombor di dalamnya:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // akan mencetak '5 8 13'
?>
Ternyata tugas kami hampir selesai. Tinggal hanya untuk memastikan bahawa sebelum hasil tambah nombor substring yang dicari kekal. Untuk ini kita akan memasukkan sebelum hasil tambah kandungan subpattern sifar :
<?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; // akan mencetak '2+3=5 3+5=8 7+8=13'
?>
Diberi rentetan:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Gantikan semua nombor dalam rentetan dengan kuasa dua mereka.
Hasil yang dijangkakan:
'The numbers are 9, 49 and 144'
Diberi rentetan:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Tukar semua tarikh kepada format hari.bulan.tahun.
Diberi rentetan:
<?php
$str = 'Costs: $15, $20, $100';
?>
Tingkatkan semua harga sebanyak 10%.