Các nhóm bắt (capturing groups) khi tìm kiếm bằng biểu thức chính quy trong PHP
Giả sử chúng ta có một chuỗi chứa tên miền:
<?php
$str = 'eee site.ru bbb';
?>
Hãy tìm tên miền đó và tách nó thành các phần: tách tên miền khỏi phần mở rộng (zone) của nó. Để làm điều này, chúng ta sẽ sử dụng các nhóm bắt (capturing groups) của biểu thức chính quy.
Các nhóm bắt đại diện cho các phần tử của mảng, vào đó bạn có thể đặt các phần của kết quả tìm được bởi biểu thức chính quy. Trong trường hợp của chúng ta, vào nhóm bắt đầu tiên chúng ta có thể đặt tên miền, và vào nhóm thứ hai - phần mở rộng của nó.
Hãy thực hiện điều đó. Đầu tiên, hãy viết biểu thức chính quy tìm tên miền trong chuỗi:
<?php
$reg = '#[a-z0-9_-]+\.[a-z]{2,}#';
?>
Bây giờ, hãy đánh dấu trong biểu thức chính quy của chúng ta phần nào sẽ đi vào nhóm bắt nào. Điều này được thực hiện bằng cách sử dụng dấu ngoặc tròn. Hãy dùng chúng để tách phần biểu thức chính quy tìm tên miền và phần tìm phần mở rộng tên miền:
<?php
$reg = '#([a-z0-9_-]+)\.([a-z]{2,})#';
?>
Bây giờ trong hàm preg_match, với tham số thứ ba,
chúng ta chỉ định một biến (tên bất kỳ):
<?php
preg_match($reg, $str, $res);
?>
Vào biến được chỉ định sẽ chứa một mảng với các nhóm bắt được tìm thấy. Trong đó, phần tử thứ 0 của mảng sẽ chứa chuỗi tìm được, phần tử thứ nhất - nhóm bắt thứ nhất, phần tử thứ hai - nhóm bắt thứ hai và cứ tiếp tục như vậy:
<?php
preg_match($reg, $str, $res);
var_dump($res); // sẽ xuất ra ['site.ru', 'site', 'ru']
?>
Cho một chuỗi chứa ngày tháng:
<?php
$str = '2025-12-31';
?>
Hãy đặt năm, tháng và ngày vào các nhóm bắt riêng biệt.
Cho một chuỗi chứa tên tệp:
<?php
$str = 'index.html';
?>
Hãy đặt tên tệp và phần mở rộng của nó vào các nhóm bắt riêng biệt.