Penggunaan Backreference dalam Ungkapan Biasa di PHP
Kandungan backreference bukan sahaja boleh diakses dalam talian penggantian, tetapi juga dalam ungkapan biasa itu sendiri: kita boleh meletakkan sesuatu ke dalam backreference, dan kemudian terus dalam ungkapan biasa menyatakan bahawa di sini mesti terdapat kandungan backreference tersebut.
Kandungan backreference boleh diakses melalui nombornya,
dengan garis sendeng belakang di depannya. Sebagai contoh,
backreference sifar boleh diakses seperti ini: \0,
backreference pertama seperti ini - \1, yang kedua
- \2 dan seterusnya.
Saya yakin bahawa semua yang ditulis di atas masih agak kabur untuk anda. Ini tidak menghairankan, memandangkan backreference adalah bahagian ungkapan biasa yang paling sukar difahami. Mari kita fahami melalui contoh.
Contoh
Katakan kita mempunyai tali seperti berikut:
<?php
$str = 'aa bb cd ef';
?>
Mari cari semua tempat dalam tali tersebut di mana terdapat dua huruf yang sama berturut-turut. Untuk menyelesaikan masalah ini, kita akan mencari sebarang huruf, memasukkan ke dalam backreference, dan kemudian memeriksa sama ada karakter seterusnya adalah kandungan backreference tersebut:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Hasilnya, yang berikut akan disimpan ke dalam pembolehubah:
'! ! cd ef'
Contoh
Katakan kita mempunyai tali seperti berikut:
<?php
$str = 'asxca buzxb csgd';
?>
Mari cari semua perkataan di dalamnya yang mana huruf pertama dan terakhir adalah sama. Untuk menyelesaikan masalah ini, kita akan tulis corak berikut: huruf, diikuti oleh satu atau lebih huruf, dan kemudian huruf yang sama seperti huruf pertama:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Hasilnya, yang berikut akan disimpan ke dalam pembolehubah:
'! ! csgd'
Contoh
Selain \1, kita boleh menulis \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Contoh
Kita juga boleh menulis \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Contoh
Dalam kurungan kerawang, kita boleh menentukan nombor negatif. Dalam kes ini, backreference akan dikira dari akhir:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Masalah Praktikal
Diberi tali:
<?php
$str = 'aaa bbb ccc xyz';
?>
Cari semua subrentetan yang mengandungi tiga huruf yang sama berturut-turut.
Diberi tali:
<?php
$str = 'a aa aaa abab bbbb';
?>
Cari semua subrentetan yang mengandungi dua atau lebih huruf yang sama berturut-turut.
Diberi tali:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Cari semua subrentetan yang mengandungi dua perkataan yang sama berturut-turut.