Dấu ngoặc không lưu giữ trong regex PHP
Dấu ngoặc () thực hiện hai chức năng -
nhóm các ký tự và chức năng bắt nhóm. Vậy
phải làm gì nếu chúng ta cần nhóm,
nhưng không muốn bắt vào nhóm?
Để giải quyết vấn đề này, người ta đã tạo ra
dấu ngoặc không lưu giữ (?: )
- chúng nhóm, nhưng không bắt vào nhóm.
Ví dụ
Trong ví dụ sau, cặp ngoặc đầu tiên chúng ta cần để nhóm, còn cặp thứ hai - để bắt nhóm. Tuy nhiên, cả hai cặp ngoặc đều lưu dữ liệu vào nhóm:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Kết quả trong các nhóm của chúng ta sẽ như sau:
<?php
var_dump($res[0]); // sẽ hiển thị 'abab123'
var_dump($res[1]); // sẽ hiển thị 'ab'
var_dump($res[2]); // sẽ hiển thị '123'
?>
Ví dụ
Hãy làm sao để cặp ngoặc đầu tiên chỉ nhóm, nhưng không bắt vào nhóm:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Kết quả trong nhóm đầu tiên sẽ là số của chúng ta:
<?php
var_dump($res[1]); // sẽ hiển thị '123'
?>
Bài tập thực hành
Cho các chuỗi con, được chia thành hai phần
bởi một số lượng tùy ý các cặp $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Hãy tìm mỗi chuỗi con như vậy và với mỗi chuỗi con tìm được, hãy đặt vào nhóm thứ nhất phần đứng trước dấu phân cách, còn vào nhóm thứ hai - phần đứng sau dấu phân cách.