1. Biểu thức chính qui (Regular Expression) là gì?
Biểu thức chính quy (Regular Expression) là thuật toán khớp mẫu mạnh mẽ có thể được thực hiện trong một biểu thức.
Biểu thức chính quy sử dụng các toán tử số học như (+, -, ^) để tạo các biểu thức phức tạp.
Trong lập trình nói chung và lập trình web nói riêng chúng ta thường sử dụng biểu thức chính quy để xác thực địa chỉ email, số điện thoại, địa chỉ IP, v.v.
Biểu thức chính quy trong PHP
Tại sao lại sử dụng biểu thức chính quy?
-
Biểu thức chính quy đơn giản hóa việc xác định các mẫu trong chuỗi dữ liệu bằng cách gọi một hàm duy nhất. Điều này giúp chúng ta tiết kiệm thời gian lập trình.
-
Khi xác thực đầu input của người dùng nhập vào như địa chỉ email, tên miền, số điện thoại, địa chỉ IP...
-
Highlight từ khóa trong kết quả tìm kiếm.
-
Khi tạo mẫu HTML tùy chỉnh. Biểu thức chính quy thông thường có thể được sử dụng để xác định các tag và thay thế chúng bằng dữ liệu thực tế.
-
Đặc biệt, sử dụng biểu thức chính quy tăng performance của chương trình rất nhiều lần.
Trong bài này bạn sẽ được học về:
-
Biểu thức chính qui (Regular Expression trong PHP)
-
Preg_match
-
Preg_split
-
Preg_replace
-
Meta characters
-
Giải nghĩa pattern
2. Biểu thức chính quy trong PHP
PHP đã xây dựng các hàm cho phép chúng ta làm việc với Regular function. Bây giờ chúng ta hãy xem các hàm biểu thức chính quy thường được sử dụng trong PHP.
preg_match - hàm này được sử dụng để thực hiện khớp mẫu trên chuỗi. Nó trả về true nếu tìm thấy kết quả khớp và false nếu không tìm thấy kết quả khớp.
preg_split - hàm này được sử dụng để thực hiện khớp mẫu trên chuỗi và sau đó chia kết quả thành một mảng số.
preg_replace - hàm này được sử dụng để thực hiện khớp mẫu trên chuỗi và sau đó thay thế chúng bằng văn bản đã chỉ định.
Dưới đây là cú pháp của hàm biểu thức chính quy (Regular expression function), chẳng hạn như preg_match, preg_split hoặc preg numplace.
Giải thích cú pháp của hàm biểu thức chính quy:
-
"function_name(...)" giống như là preg_match, preg_split hay là preg_replace
-
"/.../" Biểu thị bắt đầu và kết thúc cảu chính quy
-
"/patternt/" là pattern cần khớp
-
"subject" là chuỗi văn bản được khớp
Cụ thể hơn, chúng ta hãy xem xét các ví dụ thực tế triển khai các hàm biểu thức chính quy ở trên trong PHP.
3. Một số ví dụ về hàm biểu thức chính quy trong PHP
3.1. Hàm biểu thức chính quy preg_match
Ví dụ đầu tiên sử dụng hàm preg_match để thực hiện khớp mẫu đơn giản cho từ niit trong một URL đã cho sẵn.
Đoạn code dưới đây cho thấy việc thực hiện cho ví dụ trên:
Kết quả của chương trình;
Ở đây:
-
"preg_match(...)" là tên của hàm biểu thức chính quy
-
"/niit/" là pattern cần khớp
-
"$my_url" là biến chứa văn bản được khớp
3.2. Hàm biểu thức chính quy preg_split
Bây giờ hãy nhìn vào một ví dụ khác mà chúng ta sử dụng hàm preg_split.
Ví dụ, chúng ta muốn tách các từ trong chuỗi "Tôi yêu Regular Expression" và nhét nó vào một mảng.
Đoạn code bên dưới đây sẽ thực hiện ví dụ này:
Kết quả chúng ta nhận được là:
Lưu ý: Pattern chúng ta cần truyền vào là / / chứ không phải // để có thể tách được các từ. Nếu sử dụng // thì hàm biểu thức chính quy preg_split sẽ tách từng ký tự.
3.3. Hàm biểu thức chính quy preg-replace
Bây giờ, hãy nhìn vào hàm preg_replace thực hiện khớp mẫu và sau đó thay thế mẫu bằng một thứ khác.
Đoạn code dưới đây tìm kiếm từ niit trong một chuỗi cho trước:
Nó thay thế từ niit bằng từ niit bằng NIIT - ICT Hà Nội.
Kết quả chúng ta nhận được là:
Note: Bạn cũng có thể thay thế cả html, css
Thử chạy chương trình xem kết quả bạn nhận được là gì?
4. Biểu thức chính quy với pattern tùy chỉnh phức tạp hơn, linh hoạt hơn nhờ Metacharacters
Các ví dụ trên đã sử dụng các pattern rất cơ bản. Trong lập trình web thì thông thường sử dụng đến biểu thức chính quy đều là trường hợp cần kiểm tra, xác thực hay khớp mẫu phức tạp.
Chính vì thế bảng dưới đây sẽ giúp bạn biết cách tạo pattern phức tạp, linh hoạt hơn khi sử dụng biểu thức chính quy.
Metacharacter |
Mô tả |
Ví dụ |
. |
Khớp với bất kỳ ký tự đơn nào trừ dòng mới |
/./ sẽ khớp với bất cứ thứ gì có 1 ký tự duy nhất |
^ |
Khớp với phần đầu hoặc chuỗi bắt đầu với ký tự nào đó |
/^PH/ sẽ khớp với bất kỳ chuỗi nào bắt đâu bằng PH |
$ |
Khớp vào pattern ở cuỗi chuỗi |
/com$/ khớp với chuỗi kết thúc là com (google.com) |
* |
Khớp với bất kỳ ký tự nào |
/com*/ sẽ khớp với computer, communication, compare ... |
+ |
Yêu cầu các ký tự đứng trước xuất hiện ít nhất 1 lần |
/goo+gle/ sẽ khớp với google |
\ |
Sử dụng để ký tự sau nó là nguyên thủy |
/google+\.com/ sẽ coi dấu dấu là dấu chấm theo nghĩa đen |
[...] |
Lớp ký tự |
/[abc]/ sẽ khớp với abc |
a-z |
Khớp với các ký tự thường từ a-z |
/a-z/ sẽ khớp với các ký tự thường từ a-z |
A-Z |
Khớp với các ký tự Hoa từ A-Z |
/A-Z/ |
0-9 |
Khớp bất kỳ số nào trong khoảng từ 0 đến 9 |
/0-9/ |
Danh sách trên này chỉ đưa ra cách tạo pattern với kiểu ký tự phổ biến.
Bây giờ chúng ta thử đến với cách sử dụng pattern để kiểm tra email đơn giản.
Giải thích ý nghĩa pattern: "[/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/]"
-
"/.../" đây là bắt đầu và kết thúc biểu thức chính quy
-
"^[a-zA-Z0-9._-]" khớp với bất kỳ chữ in thường hoặc in hoa, số từ 0 đến 9 và dấu chấm, dấu gạch dưới hoặc dấu gạch ngang
-
"+@[a-zA-Z0-9-]" khớp với biểu tượng @ theo sau là chữ thường hoặc chữ in hoa (a - z và A-Z), các số từ 0 đến 9 hoặc dấu gạch ngang.
-
"+\.[a-zA-Z.]{2,5}$/" tiếp đến là dấu chấm và khớp với bất kỳ chuỗi nào là chữ thường hoặc chữ in hoa (a - z và A-Z), các số từ 0 đến 9 với độ dài từ 2 đến 5 ký tự. Kết thúc chuỗi bằng cách thêm ký tự $ vào sau cùng.
Kết quả chúng ta nhận được là:
Bạn cũng có thể tìm hiểu kỹ hơn về Biểu thức chính quy trong PHP tại đây
Tổng kết
Biểu thức chính quy (Reguar Expression) là thuật toán khớp mẫu mạnh mẽ
Biểu thức chính quy thực sự hữu ích khi thực hiện việc kiểm tra, xác nhận dữ liệu
Các hàm được dựng sẵn trong PHP như preg_match, preg_split và preg_replace hỗ trợ biểu thức chính quy
Metacharacters cho phép chúng ta tạo ra các pattern phức tạp theo yêu cầu bài toán cụ thể.
>>> Tìm hiểu kỹ hơn về Regular Expression tại khóa học lập trình PHP ở NIIT - ICT Hà Nội. Nhanh tay nhận chính sách học bổng cực kỳ hấp dẫn.