Penggantian dengan Callback melalui Regex di PHP
Misalkan kita memiliki string berikut:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Misalkan kita perlu menemukan semua konstruksi berbentuk angka+angka= dan membuatnya sehingga setelah tanda sama dengan muncul hasil penjumlahannya.
Untuk menyelesaikan tugas seperti ini, mudah untuk menggunakan
fungsi preg_replace_callback, yang
bekerja mirip dengan fungsi preg_replace
- menemukan dan mengganti berdasarkan ekspresi reguler,
tetapi memungkinkan untuk melakukan manipulasi tambahan
dengan potongan yang ditemukan.
Parameter pertama fungsi menerima regex, parameter kedua - dengan apa menggantinya, parameter ketiga - string, di mana penggantian dilakukan.
Sementara itu, ke parameter kedua harus diteruskan fungsi callback, yang akan dipanggil untuk setiap kecocokan yang ditemukan.
Parameter pertama callback perlu ditentukan variabel, ke mana hasil yang ditemukan akan dimasukkan. Variabel ini akan berupa array dari kelompok tangkapan (capturing group) yang ditemukan.
Mari kita coba dalam praktik. Tuliskan kode, yang akan menangkap substring kita, sementara meletakkan angka pertama di kelompok pertama, dan angka kedua - di kelompok kedua:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Hasilnya, var_dump kita
akan bekerja tiga kali, secara berurutan menampilkan yang berikut:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Kita lanjutkan. Setiap kecocokan akan diganti
dengan apa yang dikembalikan oleh callback melalui return.
Mari kita sebagai contoh ganti 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 menampilkan '! ! !'
?>
Dan sekarang ganti setiap substring dengan jumlah pasangan angka 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 menampilkan '5 8 13'
?>
Ternyata, tugas kita hampir selesai. Tinggal membuat agar sebelum jumlah angka, substring yang dicari tetap ada. Untuk ini kita akan menyisipkan sebelum jumlah, isi dari kelompok tangkapan nol :
<?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 menampilkan '2+3=5 3+5=8 7+8=13'
?>
Diberikan string:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Gantikan semua angka dalam string dengan kuadratnya.
Hasil yang diharapkan:
'The numbers are 9, 49 and 144'
Diberikan string:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Ubah semua tanggal ke format hari.bulan.tahun.
Diberikan string:
<?php
$str = 'Costs: $15, $20, $100';
?>
Tingkatkan semua harga sebesar 10%.