1. Giới thiệu về biểu thức chính quy trong PHP
Biểu thức chính quy hay là Regular Expression(RegEx), là một chuỗi các ký tự tạo thành một mẫu tìm kiếm, được sử dụng để xử lý một chuỗi và kiểm tra chuỗi một cách chi tiết hơn. Việc xử lý chuỗi sẽ được thông qua một biểu thức riêng, biểu thức này lại có những nguyên tắc riêng và ta phải tuân thủ theo nguyên tắc đó thì biểu thức của ta mới hoạt động được.
Biểu thức chính quy có thể được sử dụng để thực hiện tất cả các hoạt động tìm kiếm văn bản hay thay thế văn bản. Biểu thức chính quy có thể là một ký tự đơn hoặc một mẫu phức tạp hơn.
2. Cú pháp trong biểu thức chính quy
Trong PHP, biểu thức chính quy là các chuỗi gồm dấu phân cách, một mẫu hoặc các biểu mẫu tùy chọn.
Ý nghĩa | Ví dụ | |
---|---|---|
^ | Bắt đầu chuỗi nhập | ^B |
$ | Kết thúc chuỗi nhập | X$ |
. | Bất kỳ ký tự nào ngoại từ ký tự xuống dòng(\n) | i.ation |
* | Ký tự trước có thể lặp lại 0 hoặc nhiều lần | ra*t |
+ | Ký tự trước có thể lặp lại 1 hoặc nhiều lần | ra+t |
? | Ký tự trước có thể lặp lại 0 hoặc 1 lần | ra?t |
\s | Bất kỳ ký tự khoảng trắng | \sa |
\S | Bất kỳ ký tự nào không phải là khoảng trắng | \SF |
\b | Từ biên | ion\b |
\B | Bất kỳ ký tự nào không phải là từ biên | \BX\B |
3. Hàm thông dụng trong biểu thức chính quy trong PHP
3.1. Hàm preg_match
Cú pháp: preg_match($pattern, $subject, $matches, $flags, $offset);
Trong đó:
- $pattern : là chuỗi của biểu thức chính quy.
- $subject : là chuỗi cần so khớp.
- $matches : là kết quả trả về, được truyền vào dưới dạng tham chiếu(có thể trống).
- $flags : là tham số chỉ ra vị trí cắt chuỗi so khớp(có thể trống).
- $offset : là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi(có thể trống).
Hàm này sẽ trả về 1 cho ta nếu chuỗi được tìm thấy và ngược lại trả về 0 nếu không tìm thấy chuỗi(ta có thể coi tương tự như True và False). Sử dụng biểu thức chính quy để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường trong một chuỗi.
Ví dụ 1:
<?php $str = "Lap trinh tu dau"; $pattern = "/lap trinh/i"; echo preg_match($pattern, $str); // Outputs 1 ?>
Ví dụ 2: kiểm tra một chuỗi là ký tự thường
if (preg_match('/^[a-z]+$/', 'laptrinhtudau', $matches)){ var_dump($matches); }
Ví dụ 3 : kiểm tra một chuỗi là ký tự hoa
if (preg_match('/^[A-Z]+$/', 'LAPTRINHTUDAU', $matches)){ var_dump($matches); }
3.2. Hàm preg_match_all
Cú pháp: preg_match($pattern, $subject, $matches, $flags, $offset);
Trong đó:
- $pattern : là chuỗi của biểu thức chính quy.
- $subject : là chuỗi cần so khớp.
- $matches : là kết quả trả về, được truyền vào dưới dạng tham chiếu(có thể trống).
- $flags : là tham số chỉ ra vị trí cắc chuỗi so khớp(có thể trống).
- $offset : là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi(có thể trống).
Hàm này giúp ta so khớp tất cả các đoạn khớp trong chuỗi. Còn preg_match thì sẽ chỉ so khớp đoạn đầu tiên còn phần sau nó sẽ bỏ qua. Hàm preg_match_all sẽ trả về số lần mẫu được tìm thấy trong chuỗi, cũng có thể là 0.
Ví dụ:
<?php $str = "Lap trinh tu dau trang web day lap trinh online"; $pattern = "/inh/i"; echo preg_match_all($pattern, $str); ?>
3.2. Hàm preg_replace
Cú pháp: preg_replace($pattern, $replacement, $subject, $limit, $count);
Trong đó:
- $pattern : là chuỗi regex cần tìm kiếm.
- $replacement : là chuỗi thay thế cho chuỗi vừa tìm được.
- $subject : là chuỗi mà ta cần tìm và thay thế.
- $limit : là giới hạn số lần thay thế chuỗi mặc định là -1 là không giới hạn(có thể bỏ trống).
- $count : là số lần thay thế chuỗi khi sử dụng một hàm, dưới dạng tham chiếu(có thể bỏ trống).
Ví dụ:
<?php $str = "lap trinh tu dau"; $pattern = "/tu/i"; echo preg_replace($pattern, "bat", $str); ?>
Hàm này sẽ giúp ta trả về một chuỗi mới trong đó các mẫu phù hợp đã được thay thế bằng một chuỗi khác.
4. Cách viết Regex chi tiết
Tôi sẽ trình bày phần này ra thành từng mục nhỏ và ở trong các bảng để các bạn dễ nhìn và có thể so sánh chúng dễ hơn nhé!
4.1. Sửa đổi biểu thức
Biểu thức | Ý nghĩa |
---|---|
i | Tìm kiếm mà không phân biệt chữ hoa chữ thường |
m | Tìm kiếm nhiều dòng |
u | Đối sánh chính xác các mẫu được mã hóa UTF-8 |
4.2. Ký tự thường
Biểu thức | Ý nghĩa | Chú ý |
---|---|---|
a | b | Tìm một ký tự khớp với a hoặc b | |
[0 – 9] | Tìm một ký tự khớp với số từ 1 đến 9 | |
[a – z] | Khớp với những chữ từ a tới z | |
[abc] | Có thể khớp với a, b hoặc c | |
[^abc] | Không khớp với a b hay c | Dấu ^ xuất hiện sau dấu ngoặc vuông thì là phủ định |
\d | Số bất kỳ | Thay thế cho [0-9] |
\D | Ký tự không phải là số | Thay thế [^0-9] |
\s | Ký tự khoảng trắng | |
\S | Không phải ký tự khoảng trắng | Thay thế [^\s] |
\w | Ký tự chữ | |
\W | Ký tự không phải chữ | Thay thế [^\w] |
\b | Ký tự thuộc a-z hoặc A-Z hoặc 0-9 hoặc _ |
4.2. Ký tự đặc biệt
Biểu thức | Ý nghĩa |
---|---|
| | Tìm kết quả phù hợp cho bất kỳ một trong các mẫu (tương tự or) |
. | Chỉ tìm một trường hợp của bất kỳ ký tự nào, khớp với bất kỳ ký tự đơn nào ngoài \ |
^ | Tìm kết quả phù hợp ở đầu một chuỗi |
$ | Tìm kết quả phù hợp ở cuối chuỗi |
\d | Tìm một chữ số |
\s | Tìm một ký tự khoảng trắng |
\b | Tìm một kết quả phù hợp ở đầu một từ hoặc cuối một từ |
\uxxxx | Tìm ký tự unicode được chỉ định bởi số lục phân xxxx |
/ | Bắt đầu hoặc kết thúc chuỗi regex |
\ | Biểu diễn một ký tự ngay sau nó từ ký tự đặc biệt thành ký tự thường và ngược lại |
4.3. Bộ định lượng
Biểu thức | Ý nghĩa |
---|---|
n+ | Khớp với bất kỳ chuỗi nào có chứa ít nhất một n |
n* | Khớp với bất kỳ chuỗi nào không có hoặc có nhiều lần xuất hiện của n |
n? | Khớp với bất kỳ chuỗi nào có chứa 0 hoặc một lần xuất hiện của n |
n{x} | Khớp với bất kỳ chuỗi nào chứa một chuỗi X n |
n{x,y} | Khớp với bất kỳ chuỗi nào có chứa chuỗi X với chuỗi Y n |
n{x,} | Đối sánh bất kỳ chuỗi nào có chứa ít nhất một chuỗi gồm X n |
4.4. Khớp nhóm
Biểu thức | Ý nghĩa |
---|---|
() | Chọn các phần từ của mẫu được sử dụng làm đối sánh |
(? : x) | Khớp với x nhưng không rõ kết quả khớp |
x(?=y) | Chỉ khớp với x nếu ngay sau x là y |
X(?!y) | Chỉ khớp với x nếu ngay sau x không là y |
5. Ưu điểm và nhược điểm của biểu thức chính quy
Không chỉ PHP mà ở các ngôn ngữ khác đều hỗ trợ regex. Và qua những gì tôi đã giới thiệu ở trên ta sẽ rút ra một số ưu nhược điểm của regex nhé!
5.1. Ưu điểm
Vì biểu thức chính quy có tác dụng để so khớp các dữ liệu đầu vào một cách chi tiết và cụ thể nên ta có thể rằng buộc được chi tiết các dữ liệu đầu vào một cách nhanh chóng và chính xác.
5.2. Nhược điểm
Chúng ta sẽ khó mà nắm bắt được vì biểu thức chính quy khá trìu tượng và rắc rối. Nó đòi hỏi ta phải có một chút tư duy logic, và sự tập trung nếu không ta có thể sẽ tạo ra biểu thức không khớp như kết quả mà ta muốn.