PHP Cơ bản
PHP Nâng cao
PHP & Cơ sở dữ liệu MySQL
Ví dụ PHP
Tài liệu tham khảo PHP
Quảng cáo

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

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

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 mẽ nhất hiện nay để xử lý và thao tác văn bản một cách hiệu quả. Ví dụ: nó có thể được sử dụng để xác minh xem định dạng dữ liệu như tên, email, số điện thoại, v.v. do người dùng nhập có chính xác hay không, tìm hoặc 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 kiểu Perl thông qua hàm họ preg_ của nó. Tại sao lại sử dụng biểu thức chính quy kiểu Perl? Bởi vì Perl (Practical Extraction and Report Language - Ngôn ngữ báo cáo và trích xuất thực tế ) là ngôn ngữ lập trình chính thống đầu tiên cung cấp hỗ trợ tích hợp cho các biểu thức chính quy và nó nổi tiếng với sự hỗ trợ mạnh mẽ của các biểu thức chính quy cũng như khả năng xử lý và thao tác văn bản đặc biệt của nó.

Hãy bắt đầu với tổng quan ngắn gọn về các hàm so khớp mẫu tích hợp sẵn của PHP thường được sử dụng trước khi đi sâu vào thế giới của các biểu thức chính quy.

Hàm Công dụng
preg_match() Thực hiện đối sánh biểu thức chính quy.
preg_match_all() Thực hiện đối sánh cụm từ thông dụng toàn cục.
preg_replace() Thực hiện tìm kiếm và thay thế cụm từ thông dụng.
preg_grep() Trả về các phần tử của mảng đầu vào phù hợp với mẫu.
preg_split() Tách một chuỗi thành các chuỗi con bằng cách sử dụng một 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.

Ghi chú: Hàm PHP preg_match() ngừng tìm kiếm sau khi tìm thấy kết quả phù hợp đầu tiên, trong khi hàm preg_match_all() tiếp tục tìm kiếm cho đến cuối chuỗi và tìm tất cả các kết quả phù hợp có thể có thay vì dừng lại ở kết quả khớp đầu tiên.

Cú pháp biểu thức chính quy

Cú pháp biểu thức chính quy bao gồm việc sử dụng các ký tự đặc biệt (đừng nhầm lẫn với các ký tự đặc biệt trong HTML). Các ký tự được đưa ra ý nghĩa đặc biệt trong một biểu thức chính quy, bao gồm:.*?+[](){}^$|\.Bạn sẽ cần phải gạch chéo ngược các ký tự này bất cứ khi nào bạn muốn sử dụng chúng theo nghĩa đen. Ví dụ, nếu bạn muốn đối sánh ".", Bạn phải viết \.. Tất cả các ký tự khác tự động giả định nghĩa đen của chúng.

Các phần sau đây mô tả các tùy chọn khác nhau có sẵn để xây dựng các mẫu:

Các lớp ký tự

Dấu ngoặc vuông bao quanh một mẫu ký tự được gọi là một lớp ký tự, ví dụ [abc]. Một lớp ký tự luôn khớp với một ký tự trong danh sách các 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ự được sắp xếp cũng có thể được định nghĩa phù hợp với bất kỳ ký tự nào ngoại trừ những ký tự nằm trong dấu ngoặc. Một lớp ký tự bị phủ định được xác định bằng cách đặt một ký hiệu dấu mũ (^) ngay sau dấu ngoặc mở, như thế này [^abc].

Bạn cũng có thể xác định một phạm vi ký tự bằng cách sử dụng ký tự gạch nối (-) bên trong một lớp ký tự, chẳng hạn như [0-9]. Hãy xem một số ví dụ về các lớp ký tự:

RegExp Chức năng
[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 khác với a, b hoặc c.
[a-z] So khớp bất kỳ một ký tự nào từ chữ thường a đến chữ thường z.
[A-Z] So khớp bất kỳ một ký tự nào từ chữ hoa a đến chữ hoa z.
[a-Z] So khớp bất kỳ một ký tự nào từ chữ thường a đến chữ hoa Z.
[0-9] Khớp một chữ số từ 0 đến 9.
[a-z0-9] Khớp một ký tự giữa a và z hoặc từ 0 đến 9.


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

Ví dụ

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){
    echo "Match found!";
} else{
    echo "Match not found.";
}
?>

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ả phù hợp trong một chuỗi:

Ví dụ

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>

Mẹo: Biểu thức chính quy không 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.

Các lớp ký tự được xác định trước

Một số lớp ký tự như chữ số, chữ cái và khoảng trắng được sử dụng thường xuyên đến mức có tên tắt cho chúng. Bảng sau liệt kê các lớp ký tự được xác định trước đó:

Viết tắt Tác dụng
. Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới\n.
\d khớp với bất kỳ ký tự chữ số nào.Giống như[0-9]
\D Khớp với bất kỳ ký tự không phải chữ số nào.Giống như[^0-9]
\s Khớp với bất kỳ ký tự khoảng trắng nào (dấu cách, tab, dòng mới hoặc ký tự xuống dòng).Giống như[ \t\n\r]
\S Khớp với bất kỳ ký tự không có khoảng trắng nào.Giống như[^ \t\n\r]
\w Khớp với bất kỳ ký tự từ nào (được định nghĩa là a đến z, A thành Z, 0 đến 9 và dấu gạch dưới).Giống như[a-zA-Z_0-9]
\W Khớp với bất kỳ ký tự không phải từ nào.Giống như[^a-zA-Z_0-9]

Ví dụ sau sẽ chỉ cho bạn cách tìm và thay thế khoảng trắng bằng ký tự gạch nối trong một chuỗi bằng cách sử dụng biểu thức chính quy và hàm preg_replace() trong PHP :

Ví dụ

<?php
$pattern = "/\s/";
$replacement = "-";
$text = "Earth revolves around\nthe\tSun";
// Replace spaces, newlines and tabs
echo preg_replace($pattern, $replacement, $text);
echo "<br>";
// Replace only spaces
echo str_replace(" ", "-", $text);
?>

Bộ định lượng lặp lại

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

Bảng sau liệt kê các cách khác nhau để định lượng một mẫu cụ thể:

RegExp Chức năng
p+ Khớp với một hoặc nhiều lần xuất hiện của chữ cái p.
p* Khớp với không hoặc nhiều lần xuất hiện của chữ p.
p? Đối sánh số không hoặc một lần xuất hiện của chữ cái 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,} Đối sánh hai hoặc nhiều lần xuất hiện của chữ cái p.
p{,3} Đối sánh 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ẽ chia chuỗi theo dấu phẩy, chuỗi dấu phẩy, khoảng trắng hoặc kết hợp của chúng bằng cách sử dụng hàm preg_split():

Ví dụ

<?php
$pattern = "/[\s,]+/";
$text = "My favourite colors are red, green and blue";
$parts = preg_split($pattern, $text);
 
// Loop through parts array and display substrings
foreach($parts as $part){
    echo $part . "<br>";
}
?>

Vị trí neo

Có một số tình huống mà bạn muốn so khớp ở đầu hoặc cuối dòng, từ hoặc chuỗi. Để làm điều này, bạn có thể sử dụng neo. Hai ký tự neo phổ biến là dấu mũ (^) đại diện cho phần bắt đầu của chuỗi và dấu đô la ($) đại diện cho phần cuối của chuỗi.

RegExp Tác dụng
^p Ghép chữ p ở đầu dòng.
p$ Ghép 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 từ mảng tên bắt đầu bằng chữ "J" bằng cách sử dụng hàm preg_grep():

Ví dụ

<?php
$pattern = "/^J/";
$names = array("Jhon Carter", "Clark Kent", "John Rambo");
$matches = preg_grep($pattern, $names);
 
// Loop through matches array and display matched names
foreach($matches as $match){
    echo $match . "<br>";
}
?>

Công cụ sửa đổi mẫu

Công cụ sửa đổi mẫu cho phép bạn kiểm soát cách xử lý đối sánh 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ột mẫu không phân biệt chữ hoa chữ thường, bạn có thể sử dụng công cụ sửa đổi i, như thế này: /pattern/i. Bảng sau đây liệt kê một số công cụ sửa đổi mẫu được sử dụng phổ biến nhất.

Công cụ Tác dụng
i Làm cho đối sánh không phân biệt chữ hoa chữ thường.
m Thay đổi hành vi của^$để so khớp với ranh giới dòng mới (tức 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ì một ranh giới chuỗi.
g Thực hiện đối sánh toàn cục tức là tìm tất cả các lần xuất hiện.
o Chỉ đánh giá biểu thức một lần.
s Thay đổi hoạt động 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à nhận xét trong một biểu thức chính quy để rõ ràng.

Ví dụ sau đây sẽ chỉ cho bạn cách thực hiện tìm kiếm toàn cục 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().

Ví dụ

<?php
$pattern = "/color/i";
$text = "Color red is more visible than color blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>

Tương tự, ví dụ sau cho thấy cách đối sánh ở đầu mỗi dòng trong một chuỗi nhiều dòng bằng cách sử dụng ký tự neo ^ và công cụ sửa đổi m với hàm preg_match_all().

Ví dụ

<?php
$pattern = "/^color/im";
$text = "Color red is more visible than \ncolor blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>

Ranh giới từ

Ký tự ranh giới từ ( \b) giúp bạn tìm kiếm các từ bắt đầu và/hoặc kết thúc bằng một mẫu. Ví dụ: regexp /\bcar/ khớp với các từ bắt đầu bằng car và sẽ khớp với cart, carrot, hoặc cartoon, nhưng sẽ không khớp với oscar.

Tương tự, regexp /car\b/ khớp với các từ kết thúc bằng car, và cũng khớp với scar, oscar, or supercar, nhưng sẽ không khớp với cart. Tương tự như vậy, các từ /\bcar\b/ khớp với các từ bắt đầu và kết thúc với car và sẽ chỉ khớp với từ car.

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

Ví dụ

<?php
$pattern = '/\bcar\w*/';
$replacement = '<b>$0</b>';
$text = 'Words begining with car: cart, carrot, cartoon. Words ending with car: scar, oscar, supercar.';
echo preg_replace($pattern, $replacement, $text);
?>

Hy vọng bạn đã hiểu những kiến thức cơ bản về biểu thức chính quy. Để 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, vui lòng xem hướng dẫn về Xác thực biểu mẫu PHP .

Bài viết này đã giúp ích cho bạn?

Advertisements