Regular Expression trong PHP là một công cụ mạnh mẽ và linh hoạt cho phép lập trình viên thực hiện các thao tác xử lý chuỗi một cách hiệu quả. Được sử dụng rộng rãi trong việc tìm kiếm, thay thế và xác thực dữ liệu, Regular Expression (biểu thức chính quy) giúp tiết kiệm thời gian và nâng cao hiệu suất của các ứng dụng PHP. Trong bài viết này, chúng ta sẽ cùng tìm hiểu các khái niệm cơ bản, cú pháp và các ví dụ thực tiễn để hiểu rõ hơn về cách sử dụng Regular Expression trong PHP.
Regular Expression trong PHP là gì?
Regular expression, còn được biết đến với cái tên biểu thức chính quy và thường được gọi là regex (regexes), là một dãy ký tự mô tả tìm kiếm đặc biệt dưới chuỗi văn bản. Về cơ bản chúng sẽ dùng các thuật toán của ngôn ngữ lập trình để đối chiếu một số thông tin mẫu input đã xác định để thực thi các tác vụ liên quan.
Đôi khi có thể xem regex là một ngôn ngữ lập trình thu nhỏ có các kí hiệu mẫu cho phép người dùng phân tích cú pháp chuỗi text. Trình tự, quy luật chính xác của các ký tự không đoán trước được, do đó các regex sẽ tìm nạp các chuỗi cần thiết theo mẫu đã xác định.
Regular Expression trong PHP
Regex là cách nhỏ gọn để mô tả một mẫu chuỗi (string pattern) khớp với một lượng text cụ thể. Như bạn đã biết, PHP là một ngôn ngữ lập trình mã nguồn mở thường được sử dụng để tạo trang web, nó cung cấp các hàm biểu thức chính quy như một công cụ quan trọng. Giống như PHP, nhiều ngôn ngữ lập trình khác có cách triển khai biểu thức chính quy của riêng chúng.
Điều này cũng tương tự với các ứng dụng khác, những ứng dụng này có hỗ trợ biểu thức chính quy riêng có nhiều cú pháp khác nhau. Nhiều ngôn ngữ và công cụ hiện đại có sẵn áp dụng biểu thức chính quy trên các tệp và chuỗi rất lớn.
Mọi người cũng xem:
Lợi ích khi sử dụng Regular expression
Trong nhiều tình huống, các nhà phát triển phải đối mặt với các vấn đề bất cứ lúc nào mà dữ liệu được thu thập trong các free text field do hầu hết các chương trình đều xử lý mục nhập dữ liệu.
Các regex được sử dụng hầu hết mọi nơi trong lập trình ứng dụng ngày nay.
- Giúp xác thực các chuỗi văn bản mà lập trình viên quan tâm.
- Cung cấp công cụ để phân tích, tìm kiếm pattern và sửa đổi dữ liệu văn bản.
- Giúp tìm kiếm mẫu chuỗi cụ thể và trích xuất kết quả phù hợp một cách linh hoạt.
- Giúp phân tích các file văn bản tìm kiếm một chuỗi ký tự xác định để phân tích thêm hoặc thao tác dữ liệu.
- Nhờ các hàm regex tích hợp sẵn, các giải pháp dễ dàng và đơn giản giúp xác định các pattern hiệu quả hơn.
- Tiết kiệm rất nhiều thời gian phát triển, đó là tìm kiếm mẫu chuỗi cụ thể
- Xác thực thông tin quan trọng của người dùng như địa chỉ email, số điện thoại và địa chỉ IP.
- Làm nổi bật các từ khóa đặc biệt trong một file dựa trên kết quả tìm kiếm hoặc input.
- Xác định các thẻ mẫu (template tag) cụ thể và thay thế những dữ liệu đó bằng dữ liệu thực tế theo yêu cầu.
- Tạo các tag nhận dạng hệ thống mẫu HTML.
- Được sử dụng để phát hiện trình duyệt, lọc thư rác, kiểm tra độ mạnh của mật khẩu và xác thực biểu mẫu.
Bảng đối chiếu các regex trong PHP
Regular Expression | Đối chiếu tương ứng |
---|---|
vietnix | Chuỗi “vietnix” |
^vietnix | Chuỗi bắt đầu với “vietnix” |
vietnix$ | Chuỗi có từ “vietnix” ở cuối. |
^vietnix$ | Chuỗi mà “vietnix” đứng một mình trên một chuỗi |
[abc] | a, b, or c |
[a-z] | Chữ thường |
[^A-Z] | Bất kỳ chữ cái nào KHÔNG phải là chữ in hoa |
(gif|png) | Chỉ “gif” hoặc “png” |
[a-z]+ | Một hoặc nhiều chữ thường |
^[a-zA-Z0-9]{1, }$ | Bất kỳ từ nào có ít nhất một số hoặc một chữ cái |
([ax])([by]) | ab, ay, xb, xy |
[^A-Za-z0-9] | Bất kỳ ký hiệu nào không phải chữ hoặc số |
([A-Z]{3}|[0-9]{5}) | Trung khớp 3 chữ cái hoặc 5 chữ số |
Các operators về Regular Expression
Operator | Mô tả |
---|---|
^ | Bắt đầu chuỗi |
$ | Kết thúc chuỗi |
. | Biểu thị hầu hết ký tự đơn lẻ |
() | Biểu thị một nhóm biểu thức |
[] | Tìm một khoảng các ký tự ([xyz] nghĩa là gồm x,y,z) |
[^] | Tìm các ký tự không thuộc trong khoảng đó |
– (dash) | Tìm phạm vi ký tự trong khoảng cho trước |
| (pipe) | Biểu thị logic của OR (hoặc) |
? | Không biểu thị hoặc có biểu thị một trong các ký tự hoặc phạn vi trược đó |
* | Không biểu thị hoặc có biểu thị nhiều ký tự hay phạm vi trước đó |
+ | Biểu thị một hoặc nhiều ký tự hay phạm vi trước đó |
{n} | Biểu thị chính xác n lần của phạm vi ký tự hoặc mục trước đó, ví dụ n{2} |
{n, } | Biểu thị ít nhất n lần phạm vi ký tự hoặc mục trước đó, ví dụ n{2, }. |
{n, m} | Biểu thị ít nhất n nhưng không quá m lần, ví dụ n{2, 4} có nghĩa là 2 đến 4 của n |
\ | Ký tự thoát. |
Special Character Classes – lớp ký tự đăc biệt
Kí tự đặc biệt | Ý nghĩa |
---|---|
\n | Xuống dòng mới |
\r | Quay lại |
\t | Hiển thị một tab |
\v | Hiển thị một tab nằm dọc |
\f | Biểu thị form feed. |
\xxx | Ký tự octal xxx. |
\xhh | Ký tự hex hh. |
Shorthand Character Sets
Shorthand | Ý nghĩa |
---|---|
\s | Trùng khớp với các ký tự khoảng trắng |
\d | Trùng khớp với các ký tự số 0 – 9 |
\w | Trùng khớp với các ký tự chữ hoa / thường, số, dấu gạch dưới (_) |
Predefined functions hoặc Regex library
Các hàm xác định trước (Predefined functions) trong PHP dành cho regex, các hàm này có phân biệt chữ hoa / thường.
Hàm | Mô tả |
---|---|
preg_match() | Hàm này tìm kiếm một pattern cụ thể đối với một số chuỗi. Nó trả về true nếu mẫu tồn tại và sai nếu không có. |
preg_match_all() | Hàm này tìm kiếm tất cả các lần xuất hiện của string pattern so với chuỗi. Chức năng này rất hữu ích cho việc tìm kiếm và thay thế. |
ereg_replace() | Hàm này tìm string pattern và thay vào chuỗi gốc bằng chuỗi thay thế nếu có. |
eregi_replace() | Hàm hoạt động giống như ereg_replace() miễn là việc tìm kiếm mẫu không phân biệt chữ hoa chữ thường. |
preg_replace() | Hàm này hoạt động giống như hàm ereg_replace() với điều kiện là các regex có thể được sử dụng trong string pattern và chuỗi thay thế. |
preg_split() | Hàm này hoạt động giống như hàm split() của PHP. Nó phân tách chuỗi bằng các regex làm tham số của nó. |
preg_grep() | Hàm này tìm kiếm tất cả các phần tử khớp với mẫu regex và trả về mảng output. |
preg_quote() | Hàm này lấy chuỗi và dấu ngoặc kép phía trước mỗi ký tự khớp với regex. |
ereg() | Hàm này tìm kiếm một chuỗi được chỉ định bởi một pattern và trả về true nếu tìm thấy, nếu không thì trả về false. |
eregi() | Hàm này hoạt động giống như hàm ereg() miễn là tìm kiếm không phân biệt chữ hoa chữ thường. |
<?php
// Declare a regular expression
$regex = '/^[a-zA-Z ]*$/';
// Declare a string
$nameString = 'Sharukh khan';
// Use preg_match() function to
// search string pattern
if(preg_match($regex, $nameString)) {
echo("Name string matching with"
. " regular expression");
}
else {
echo("Only letters and white space"
. " allowed in name string");
}
?>
Output như sau:
Name string matching with regular expression
Bạn có thể xem các ví dụ khác bên dưới:
Ví dụ 1:
<?php
// Declare a regular expression
$regex = "/<b>(.*)<\/b>/U";
// Declare a string
$inputString = "Name: <b>John</b> Position: <b>Developer</b>";
// Use preg_match_all() function to perform
// a global regular expression match
preg_match_all($regex, $inputString, $output);
echo $output[0][0]." <br> ".$output[0][1]."\n";
?>
Output như sau:
John Developer
Ví dụ 2:
<?php
// Declare a regular expression
$regex = "([0-9]+)";
// Declare a string
$original = "Completed graduation in 2004";
$replaceWith = "2002";
// Use ereg_replace() function to search a
// string pattern in an other string
$original = ereg_replace($regex, $replaceWith, $original);
// Display result
echo $original;
?>
Output như sau:
Completed graduation in 2002
Ví dụ 3:
<?php
<?php
// Declare a string
$ip = "134.645.478.670";
// Declare a regular expression
$regex = "/\./";
// Use preg_split() function to
// convert a given string into
// an array
$output = preg_split ($regex, $ip);
echo "$output[0] <br>";
echo "$output[1] <br>";
echo "$output[2] <br>";
echo "$output[3] <br>";
?>
Output như sau:
134 645 478 670
Metacharacters
Có hai loại ký tự được sử dụng trong regex, đó là: Regular characters và Metacharacters. Các ký tự thông thường (Regular characters) là những ký tự có nghĩa ‘theo nghĩa đen’ và Siêu ký tự (Metacharacters) là những ký tự có nghĩa ‘đặc biệt’ trong biểu thức chính quy (Regular Expression).
Metacharacter | Mô tả | Ví dụ |
---|---|---|
. | Trùng khớp với bất kỳ ký tự nào ngoài dòng mới | /./ khớp với chuỗi có 1 ký tự |
^ | Khớp với đầu chuỗi | /^vietnix/ khớp bắt kỳ chuỗi bắt đầu bằng vietnix |
$ | Khớp với string pattern ở cuối chuỗi | /com$/ khớp với chuỗi kết thúc bằng com Ví dụ: google.com |
* | Không khớp hoặc khớp nhiều ký tự | /com*/ khớp với commute, computer, compromise,… |
+ | Khớp với ký tự trước xuất hiện ít nhất 1 lần | For example /z+oom/ khớp với zoom. |
\ | Chuyển hóa metacharacter khỏi regex | /google\.com/ dấu chấm sẽ được xe mlà giá trị, không phải ký tự. |
a-z | Khớp chữ thường | vietnix |
A-Z | Khớp chữ hoa | VIETNIX |
0-9 | Khớp với bất kỳ số 0 – 9 | /0-5/ chỉ ra 0, 1, 2, 3, 4, 5 |
[…] | Khớp với lớp ký tự | /[pqr]/ trùng khớp với pqr |
Thêm ví dụ khác:
Regular expression | Ý nghĩa |
---|---|
^[.-a-z0-9A-Z] | Nó khớp với chuỗi có dấu chấm, dấu gạch ngang và bất kỳ chữ thường nào, các số từ 0 đến 9 và các chữ hoa. |
+@[a-z0-9A-Z] | Nó khớp với chuỗi có ký hiệu @ ở đầu, theo sau là bất kỳ chữ thường, số từ 0 đến 9 và chữ hoa. |
+\.[az]{2, 6}$/ | Nó thoát khỏi dấu chấm và sau đó khớp chuỗi với bất kỳ chữ cái viết thường nào có độ dài chuỗi từ 2 đến 6 ở cuối. |
POSIX Regular Expressions
Một số regex trong PHP giống như biểu thức số học được gọi là regex POSIX. Đôi khi, biểu thức phức tạp được tạo bằng cách kết hợp các phần tử hoặc toán tử khác nhau trong regex. Biểu thức chính cơ bản là biểu thức khớp với một ký tự.
Regular Expressions | Ý nghĩa |
---|---|
[0-9] | Khớp với chữ số từ 0 đến 9. |
[az] | Khớp với bất kỳ chữ cái viết thường nào từ a đến z. |
[AZ] | Khớp với bất kỳ chữ cái viết hoa nào từ A đến Z. |
[aZ] | Khớp với bất kỳ chữ cái viết thường nào đến chữ cái viết hoa Z. |
[:lower:] | Khớp với bất kỳ chữ cái viết thường nào. |
[:upper:] | Phù hợp với bất kỳ chữ in hoa. |
[:alpha:] | Khớp với tất cả các ký tự chữ cái hoặc chữ cái từ az và AZ. |
[[:alpha:]] | Khớp với bất kỳ chuỗi nào chứa các ký tự chữ cái hoặc chữ cái. |
[:alnum:] | Khớp với tất cả các ký tự chữ và số, tức là tất cả các chữ số (0-9) và chữ cái (az AZ). |
[[:alnum:]] | Khớp với bất kỳ chuỗi nào chứa ký tự chữ và số và chữ số. |
[:digit:] | Khớp với tất cả các chữ số từ 0 đến 9. |
[[:digit:]] | Khớp với bất kỳ chuỗi nào chứa các chữ số từ 0 đến 9. |
[:xdigit:] | Khớp với tất cả các chữ số thập lục phân. |
[:punct:] | Khớp với tất cả các ký hiệu dấu chấm câu. |
[:blank:] | Khớp với các ký tự trống như dấu cách và tab. |
[:space:] | Khớp với tất cả các ký tự khoảng trắng như ngắt dòng. |
[[:space:]] | Khớp với bất kỳ chuỗi nào chứa khoảng trắng. |
[:cntrl:] | Khớp với tất cả các ký tự điều khiển. |
[:graph:] | Khớp với tất cả các ký tự hiển thị hoặc in ngoài khoảng trắng và ký tự điều khiển. |
[:print:] | Khớp với tất cả các ký tự in và khoảng trắng ngoại trừ các ký tự điều khiển. |
[:word:] | Khớp với tất cả các ký tự từ như chữ số, chữ cái và dấu gạch dưới. |
Quantifiers trong Regular Expression
Bộ định lượng (quantifiers) là ký tự đặc biệt cho biết số lượng, tần suất, số lần xuất hiện, xảy ra của ký tự hoặc nhóm ký tự ở trong ngoặc. Chúng được gọi là ký tự greedy, lazy
a+ | Khớp với chuỗi chứa ít nhất một ký tự a. |
a* | Khớp với chuỗi chứa 0 hoặc nhiều ký tự a. |
a? | Khớp với bất kỳ chuỗi nào chứa số không hoặc một số a. |
a{x} | Khớp với chữ ‘a’ chính xác x lần. |
a{2, 3} | Khớp với bất kỳ chuỗi nào chứa sự xuất hiện của hai hoặc ba chữ a. |
a{2, } | Khớp với bất kỳ chuỗi nào chứa sự xuất hiện của ít nhất hai chữ a. |
a{2} | Khớp với bất kỳ chuỗi nào chứa sự xuất hiện của chính xác hai chữ cái a. |
a{, y} | Khớp với bất kỳ chuỗi nào chứa số lần xuất hiện không quá y số a. |
a$ | Khớp với bất kỳ chuỗi nào có ‘a’ ở cuối chuỗi. |
^a | Khớp với bất kỳ chuỗi nào có ‘a’ ở đầu chuỗi. |
[^a-zA-Z] | Khớp với bất kỳ mẫu chuỗi nào không có các ký tự từ a đến z và A đến Z. |
a.a | Khớp với bất kỳ mẫu chuỗi nào chứa a, sau đó là bất kỳ ký tự nào và sau đó là ký tự a khác. |
^.{3}$ | Khớp với bất kỳ chuỗi nào có chính xác ba ký tự. |
Các dạng regex thường thấy:
- Regexp
- RegexBuddy
Biểu thức chính quy là một pattern mô tả một số văn bản chuỗi trong một pattern cụ thể hoặc nó được định nghĩa là một thuật toán pattern-matching được biểu thị trong một dòng. Các biểu thức chính quy rất hữu ích trong thế giới lập trình để kiểm tra xác thực và nhận dạng các mẫu cụ thể. PHP cung cấp nhiều hàm dựng sẵn hỗ trợ các regex. Metacharacters giúp tạo các mẫu phức tạp.
Lời kết
Vietnix hy vọng nội dung bài viết trên đã giúp bạn hiểu rõ hơn về biểu thức chính quy Regular Expression trong PHP. Ngoài ra, bạn cũng có thể tham khảo thêm các bài viết khác tại vietnix.vn để hiểu hơn về lập trình, chúc bạn thành công!