Lookahead trong biểu thức chính quy PHP
Đôi khi cần giải quyết bài toán dạng này: tìm
chuỗi 'aaa' và thay thế nó bằng '!',
nhưng chỉ khi sau 'aaa' là
'x', còn bản thân 'x' thì
không thay thế. Nếu cố giải bài toán này
'một cách trực tiếp', chúng ta sẽ không thành công:
<?php
preg_replace('#aaax#', '!', 'aaax'); // sẽ là '!', nhưng cần '!x'
?>
Để giải bài toán, cần một cách để nói rằng
'x' không nên bị thay thế. Điều này được
thực hiện bằng các dấu ngoặc đặc biệt (?= ),
chỉ "nhìn" nhưng không "lấy" theo.
Các dấu ngoặc này được gọi là positive lookahead
. Positive - bởi vì 'x'
(trong trường hợp của chúng ta) phải tồn tại - chỉ khi đó
việc thay thế mới xảy ra.
Hãy áp dụng các dấu ngoặc này để giải bài toán của chúng ta:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // trả về '!x'
?>
Ngoài ra còn có negative lookahead
- (?! ) - nó, ngược lại, nói rằng
một cái gì đó phải không tồn tại. Trong ví dụ tiếp theo,
việc thay thế sẽ xảy ra, chỉ khi sau 'aaa'
không phải là 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // trả về '!b'
?>
Cho một chuỗi chứa tên các hàm:
<?php
$str = 'func1() func2() func3()';
?>
Lấy mảng tên các hàm từ chuỗi.
Cho một chuỗi với thẻ:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Lấy mảng tên các thuộc tính của thẻ này.