Nhóm bắt (capturing groups) trong biểu thức chính quy PHP
Nội dung của các nhóm bắt không chỉ có thể truy cập được trong chuỗi thay thế, mà còn ngay trong chính biểu thức chính quy: chúng ta có thể đặt một thứ gì đó vào một nhóm bắt, sau đó ngay trong biểu thức chính quy có thể nói rằng ở đây phải là nội dung của nhóm bắt đó.
Nội dung của các nhóm bắt có thể truy cập được bằng số của chúng,
phía trước có dấu gạch chéo ngược. Ví dụ,
nhóm bắt số 0 sẽ được truy cập như thế này: \0,
nhóm bắt thứ nhất như thế này - \1, nhóm thứ hai
- \2 và cứ tiếp tục như vậy.
Tôi tin chắc rằng tất cả những điều viết ở trên hiện tại còn khá mơ hồ đối với bạn. Điều đó không có gì lạ, bởi vì nhóm bắt là phần khó hiểu nhất của biểu thức chính quy. Hãy cùng tìm hiểu qua các ví dụ.
Ví dụ
Giả sử chúng ta có chuỗi như sau:
<?php
$str = 'aa bb cd ef';
?>
Hãy tìm trong đó tất cả các vị trí mà có hai chữ cái giống nhau bất kỳ đứng liền nhau. Để giải quyết bài toán, chúng ta sẽ tìm bất kỳ chữ cái nào, đặt nó vào một nhóm bắt, sau đó kiểm tra xem ký tự tiếp theo có phải là nội dung của nhóm bắt đó không:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! ! cd ef'
Ví dụ
Giả sử chúng ta có chuỗi như sau:
<?php
$str = 'asxca buzxb csgd';
?>
Hãy tìm trong đó tất cả các từ mà chữ cái đầu tiên và cuối cùng giống nhau. Để giải quyết bài toán, chúng ta viết mẫu sau: một chữ cái, sau đó là một hoặc nhiều chữ cái nữa, và cuối cùng là chữ cái giống như chữ cái đầu tiên:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! ! csgd'
Ví dụ
Thay vì \1 có thể viết \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Ví dụ
Cũng có thể viết \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Ví dụ
Trong dấu ngoặc nhọn có thể chỉ định các số âm. Trong trường hợp này, các nhóm bắt sẽ được đếm từ cuối lên:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Bài tập thực hành
Cho chuỗi:
<?php
$str = 'aaa bbb ccc xyz';
?>
Tìm tất cả các chuỗi con, trong đó có ba chữ cái giống nhau liên tiếp.
Cho chuỗi:
<?php
$str = 'a aa aaa abab bbbb';
?>
Tìm tất cả các chuỗi con, trong đó có hai hoặc nhiều chữ cái giống nhau liên tiếp.
Cho chuỗi:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Tìm tất cả các chuỗi con, trong đó có hai từ giống nhau liên tiếp.