Các Nhóm Bắt Giữ Có Tên Trong Biểu Thức Chính Quy PHP
Giả sử chúng ta muốn sử dụng preg_match để
tách ngày tháng thành ngày, tháng và năm. Hãy sử dụng
các nhóm bắt giữ cho việc này:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // sẽ xuất ra ['2025-10-29', '2025', '10', '29']
?>
Như bạn thấy, kết quả chúng ta nhận được là một mảng, trong đó phần tử thứ 0 là toàn bộ ngày tháng, thứ nhất - năm, thứ hai - tháng, thứ ba - ngày.
Tuy nhiên, đôi khi sẽ thuận tiện nếu nhận được nội dung của các nhóm bắt giữ dưới dạng mảng kết hợp. Tức là trong trường hợp của chúng ta, thật tốt nếu nhận được mảng như thế này:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Để làm điều này, trong biểu thức chính quy có cú pháp
đặc biệt. Đây là nó: (?<name>pattern),
trong đó pattern là biểu thức chính quy, còn name
là tên của nhóm bắt giữ.
Hãy viết lại biểu thức chính quy cho ngày tháng của chúng ta bằng các nhóm bắt giữ có tên:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Kết quả chúng ta sẽ có một mảng kết hợp, trong đó các khóa là tên của các nhóm bắt giữ, còn các giá trị là những gì được bắt trong chúng:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Thực tế, trong mảng kết quả, các giá trị
của nhóm bắt giữ sẽ có thể truy cập được cả bằng tên
lẫn bằng số thứ tự. Tức là, ví dụ,
năm sẽ có thể truy cập được bằng khóa 'year'
và bằng số 1, tháng - bằng khóa 'month'
và bằng số 2, và tương tự:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Các nhóm bắt giữ có tên được mô tả còn có một số
cú pháp thay thế khác: (?P<name>pattern)
và (?'name'pattern).
Cho một chuỗi chứa thời gian:
<?php
$str = '12:59:59';
?>
Hãy đặt giờ, phút và giây vào các nhóm bắt giữ có tên riêng biệt.
Viết một hàm, trong mảng kết quả, xóa tất cả các nhóm bắt giữ được đánh số, chỉ giữ lại các nhóm có tên.