Biểu thức chính quy trong PHP – Regular Expressions

Trong bài hướng dẫn tự học PHP này, bạn sẽ tìm hiểu cách các biểu thức chính quy hoạt động, cũng như cách sử dụng chúng để thực hiện khớp mẫu trong PHP.

Biểu thức chính quy trong PHPBiểu thức chính quy trong PHP

Biểu thức chính quy là gì?

Biểu thức chính quy, thường được gọi là ‘regex‘ hoặc ‘RegExp‘, là một chuỗi văn bản có định dạng đặc biệt được sử dụng để tìm các mẫu trong văn bản.

Biểu thức chính quy là một trong những công cụ mạnh nhất hiện nay để xử lý hiệu quả công việc liên quan đến văn bản hiệu.

Ví dụ: Nó có thể được sử dụng để xác minh xem định dạng của dữ liệu như tên, email, số điện thoại, v.v. mà người dùng nhập có chính xác định dạng hay không, xác định mẫu để thay thế chuỗi phù hợp trong nội dung văn bản, v.v.

PHP (phiên bản 5.3 trở lên) hỗ trợ các biểu thức chính quy như ngôn ngữ Perl thông qua hàm preg_.

Tại sao lại giống như Perl ?
Bởi vì Perl là ngôn từ lập trình chính thống tiên phong phân phối sự tương hỗ tích hợp cho những biểu thức chính quy và Perl được nhiều lâp trình viên biết đến với sự tương hỗ can đảm và mạnh mẽ những biểu thức chính quy và năng lực giải quyết và xử lý văn bản đặc biệt hiệu quả của nó .
Chúng ta hãy mở màn với một số ít hàm tích hợp của PHP thường được sử dụng để triển khai những so khớp những biểu thức chính quy .

Hàm Tác dụng
preg_match() Thực hiện khớp biểu thức chính quy
preg_match_all() Thực hiện khớp biểu thức chính quy toàn cục
preg_replace() Thực hiện tìm kiếm biểu thức chính quy và thay thế
preg_grep() Trả về các phần tử của mảng đầu vào và khớp mẫu
preg_split() Tách một chuỗi con bằng biểu thức chính quy
preg_quote() Trích dẫn các ký tự biểu thức chính quy được tìm thấy trong một chuỗi

Lưu ý : Hàm preg_match ( ) của PHP ngừng tìm kiếm sau khi nó tìm thấy so khớp tiên phong, trong khi hàm preg_match_all ( ) liên tục tìm kiếm cho đến cuối chuỗi và tìm thấy toàn bộ những mẫu so khớp hoàn toàn có thể thay vì dừng lại ở lần so khớp đúng tiên phong .

Cú pháp của Biểu thức chính quy

Cú pháp biểu thức chính quy gồm có việc sử dụng những ký tự đặc biệt quan trọng ( không nên nhầm lẫn với những ký tự đặc biệt quan trọng HTML ) .
Các ký tự được cho ý nghĩa đặc biệt quan trọng trong một biểu thức chính quy là :

. * ? + [ ] () {} ^ $ | \\

Bạn sẽ cần đặt ký tự \ trước những ký tự này bất kể khi nào bạn muốn sử dụng chúng theo nghĩa đen .

Ví dụ: Nếu bạn muốn khớp ‘.‘, Bạn phải viết \.

Các phần sau đây miêu tả những tùy chọn khác nhau có sẵn để thiết kế xây dựng những mẫu :

Quy tắc xây dựng Biểu thức chính quy trong PHP

Dấu ngoặc vuông bao quanh một mẫu ký tự được gọi là lớp ký tự, ví dụ như : [ abc ] .
Một lớp ký tự luôn khớp một ký tự trong list những ký tự được chỉ định có nghĩa là biểu thức [ abc ] chỉ khớp với ký tự a, b hoặc c .
Các lớp ký tự phủ định cũng hoàn toàn có thể được định nghĩa khớp với bất kể ký tự nào ngoại trừ những ký tự có trong ngoặc .
Một lớp ký tự phủ định được xác lập bằng cách đặt ký hiệu dấu mũ ( ^ ) ngay sau dấu ngoặc mở, như thế này [ ^ abc ] .
Bạn cũng hoàn toàn có thể xác lập một khoanh vùng phạm vi những ký tự bằng cách sử dụng ký tự gạch nối ( – ) bên trong một lớp ký tự, như [ 0-9 ]. Hãy xem xét 1 số ít ví dụ về những lớp ký tự :

RegExp Mô tả
[abc] Khớp với bất kỳ một trong các ký tự a, b hoặc c.
[^abc] Khớp với bất kỳ một ký tự nào ngoại trừ a, b hoặc c.
[a-z] Khớp bất kỳ một ký tự từ chữ thường từ a đến z
[A-Z] Khớp bất kỳ một ký tự từ chữ HOA từ a đến z
[a-Z] Khớp bất kỳ một ký tự từ chữ thường a đến chữ HOA Z
[0-9] Khớp một chữ số duy nhất trong khoảng từ 0 đến 9.
[a-z0-9] Khớp một ký tự đơn giữa a và z hoặc giữa 0 và 9

Ví dụ sau đây sẽ cho bạn thấy cách tìm xem một mẫu có tồn tại trong chuỗi hay không bằng cách sử dụng biểu thức chính quy và hàm preg_match() của PHP:

Tương tự, bạn có thể sử dụng hàm preg_match_all() để tìm tất cả các kết quả khớp trong một chuỗi:

Lưu ý: Các biểu thức chính quy không chỉ dành riêng cho PHP. Các ngôn ngữ như Java, Perl, Python, v.v … sử dụng cùng một ký hiệu để tìm các mẫu trong văn bản.

Bộ định lượng trong Biểu thức chính quy

Trong phần trước, tất cả chúng ta đã học cách phối hợp một ký tự trong nhiều kiểu khác nhau. Nhưng nếu bạn muốn so khớp ký tự nào đó Open nhiều lần thì sao ?
Ví dụ : Giả sử bạn muốn tìm ra những từ có chứa một hoặc nhiều phiên bản của chữ p hoặc những từ có chứa tối thiểu hai chữ p, v.v.
Đây là định lượng phát huy tính năng. Với những bộ lượng hóa, bạn hoàn toàn có thể chỉ định số lần một ký tự trong biểu thức chính quy cần phải so khớp .
Bảng sau liệt kê những cách khác nhau để định lượng một mẫu đơn cử :

RegExp Mô tả
p+ Khớp với một hoặc nhiều lần xuất hiện của chữ p
p* Khớp 0 hoặc nhiều lần xuất hiện của chữ p.
p? Khớp 0 hoặc một lần xuất hiện của chữ p.
p{2} Khớp chính xác hai lần xuất hiện của chữ p
p{2,3} Khớp ít nhất hai lần xuất hiện của chữ p, nhưng không quá ba lần xuất hiện của chữ p.
p{2,} Khớp hai hoặc nhiều lần xuất hiện của chữ p
p{,3} Khớp nhiều nhất ba lần xuất hiện của chữ p

Biểu thức chính quy trong ví dụ sau sẽ phân tách chuỗi theo dấu phẩy, chuỗi dấu phẩy, khoảng chừng trắng hoặc phối hợp của nó bằng cách sử dụng hàm preg_split ( ) của PHP :

";
  }
?>

So khớp dựa theo vị trí trong biểu thức chính quy

Có một số ít trường hợp mà bạn muốn so khớp ở đầu hoặc cuối của một dòng, từ hoặc một chuỗi. Để làm điều này, bạn hoàn toàn có thể sử dụng neo vị trí .
Hai vị trí neo phổ cập là :

  • Dấu mũ (^) đại diện cho phần bắt đầu của chuỗi
  • Ký hiệu đô la ($) đại diện cho phần cuối của chuỗi.
RegExp Mô tả
^p So khớp với chữ p ở đầu dòng
p$ So khớp với chữ p ở cuối dòng

Biểu thức chính quy trong ví dụ sau sẽ chỉ hiển thị những tên khởi đầu bằng chữ “ J ” từ một mảng tên bằng cách sử dụng hàm preg_grep ( ) của PHP :

";
  }
?>

Sửa đổi Pattern trong Biểu thức chính Quy

Công cụ sửa đổi pattern được cho phép bạn trấn áp cách giải quyết và xử lý khớp mẫu. Công cụ sửa đổi mẫu được đặt trực tiếp sau biểu thức chính quy .
Ví dụ : Nếu bạn muốn tìm kiếm mẫu theo cách không phân biệt chữ hoa chữ thường, bạn hoàn toàn có thể sử dụng công cụ sửa đổi i, như sau : / pattern / i .
Bảng sau liệt kê một số ít công cụ sửa đổi mẫu được sử dụng phổ cập nhất :

Modifier Mô tả
i Không phân biệt chữ HOA – chữ thường
m Thay đổi hành vi của ^ và $ để khớp với ranh giới dòng mới (nghĩa là bắt đầu hoặc kết thúc mỗi dòng trong một chuỗi nhiều dòng), thay vì ranh giới chuỗi.
g Thực hiện khớp toàn cục, tìm thấy tất cả các lần xuất hiện
o Đánh giá biểu thức chỉ một lần.
s Thay đổi hành vi của. (dấu chấm) để khớp với tất cả các ký tự, bao gồm cả dòng mới.
x Cho phép bạn sử dụng khoảng trắng và comment trong một biểu thức chính quy cho rõ ràng.

Ví dụ sau đây sẽ cho bạn thấy cách thực hiện tìm kiếm không phân biệt chữ hoa chữ thường bằng cách sử dụng công cụ sửa đổi i và hàm preg_match_all() của PHP:

Tương tự, ví dụ sau đây cho thấy cách so khớp ở đầu mỗi dòng trong chuỗi nhiều dòng bằng cách sử dụng neo vị trí đầu với ký tự mũ (^) và (m) với hàm preg_match_all() của PHP:

Ranh giới các từ trong Biểu thức chính quy

Một ký tự ranh giới từ ( \ b ) giúp bạn tìm kiếm những từ mở màn và / hoặc kết thúc bằng một mẫu .

Ví dụ: Mẫu /\bcar/ khớp với các từ bắt đầu bằng mẫu car và sẽ khớp với cart, carot hoặc cartoon, nhưng sẽ không khớp với từ oscar.

Tương tự, Mẫu /car\b/ khớp với các từ kết thúc bằng mẫu xe và sẽ khớp với car, oscar hoặc supercar, nhưng sẽ không khớp với cart, cartoon, carot.

Tương tự, /\bcar\b/ so khớp với các từ bắt đầu và kết thúc với từ car. Do đó nó sẽ chỉ khớp với từ car

Ví dụ sau đây sẽ làm nổi bật các từ bắt đầu bằng car in đậm:

$0

‘;
$text = ‘Words begining with car: cart, carrot, cartoon. Words ending
with car: scar, oscar, supercar.’;
echo preg_replace($pattern, $replacement, $text);
?>
Tham khảo PHP Cheat Sheet
PHP Cheat Sheet

Lời Kết

Mình hy vọng bạn đã hiểu những điều cơ bản của Biểu thức chính quy trong PHP. Để tìm hiểu cách xác thực dữ liệu biểu mẫu bằng biểu thức chính quy, bạn có thể xem lại bài hướng dẫn về Xác thực biểu mẫu với PHP.

Lưu ý, nhiều lúc để ngày càng tăng thưởng thức người dùng, bạn không cần so khớp quá đúng mực .