Giới hạn tính tham lam trong biểu thức chính quy trong PHP
Biểu thức chính quy mặc định là tham lam. Điều này có nghĩa là chúng sẽ khớp với số lượng ký tự tối đa có thể.
Hãy cùng phân tích một ví dụ. Giả sử chúng ta có một chuỗi như sau:
<?php
$str = 'aeeex zzz x kkk';
?>
Giả sử trong chuỗi này chúng ta muốn tìm chuỗi con
'aeeex' theo mẫu sau: chữ cái
'a', sau đó là bất kỳ ký tự nào một lần trở lên,
rồi đến chữ cái 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Chúng ta mong đợi rằng kết quả trong biến
sẽ là chuỗi '! zzz x kkk'. Tuy nhiên,
điều đó không xảy ra - biến nhận được chuỗi
'! kkk'.
Vấn đề nằm ở chỗ biểu thức chính quy của chúng ta tìm tất cả
các ký tự từ chữ cái 'a' đến chữ cái 'x'.
Nhưng trong chuỗi của chúng ta có hai chữ cái 'x'. Do
tính tham lam, biểu thức chính quy sẽ tìm đến
chữ 'x' cuối cùng, do đó khớp với phần
không như chúng ta mong đợi.
Tất nhiên, thông thường hành vi này là điều chúng ta cần. Nhưng trong trường hợp cụ thể này, chúng ta muốn hủy bỏ tính tham lam và yêu cầu biểu thức chính quy tìm đến chữ 'x' đầu tiên.
Để giới hạn tính tham lam, cần đặt dấu chấm hỏi sau toán tử lặp:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Tính tham lam có thể được giới hạn cho tất cả các toán tử
lặp, như sau: *?, ??
và {}?.
Cho chuỗi:
<?php
$str = 'aba accca azzza wwwwa';
?>
Hãy viết biểu thức chính quy tìm tất cả các chuỗi
mà ở hai đầu là chữ cái 'a',
và thay thế mỗi chuỗi đó bằng '!'. Giữa
các chữ cái a có thể là bất kỳ ký tự nào (ngoại trừ
'a').