Regular Expression (hay còn gọi là Regex hoặc Regexp) là một công cụ rất mạnh mẽ, linh hoạt và được sử dụng phổ biến trong lập trình. Với Regex việc tìm kiếm hay xử lý các chuỗi văn bản sẽ nhanh chóng và thuận tiện hơn. Thông thường, Regex thường được tích hợp sẵn và hỗ trợ bởi các hàm xử lý chuỗi, giúp chúng ta thuận tiện hơn trong việc sử dụng và xử lý. Không ngoại lệ, PHP cũng được tích hợp sẵn Regex, trong bài viết này chúng ta sẽ cùng tìm hiểu về cách sử dụng của Regex trong PHP.

Bạn muốn trở thành một nhà lập trình PHP chuyên nghiệp? Hãy bắt đầu với cuốn Ebook hữu ích từ Stringee! 

>>> ĐĂNG KÝ NHẬN EBOOK PHP MIỄN PHÍ TẠI ĐÂY:  

1. Tại sao nên sử dụng Regular Expression trong PHP

Làm việc với chuỗi, chúng ta thường phải xử lý tìm kiếm, thay thế hoặc xử lý chúng dựa trên một đầu vào (mẫu). Sử dụng Regular Expression luôn là một sự lựa chọn rất tốt mà chúng ta không thể bỏ qua. Tác dụng của Regular Expression:

  • Tìm kiếm và xử lý nâng cao: Với Regex, việc tìm kiếm và xử lý chuỗi sẽ trở nên nhanh chóng và linh hoạt hơn. Chúng ta có thể làm việc với các mẫu có những định dạng phức tạp như email, số điện thoại, URL,...
  • Tự động hóa công việc xử lý văn bản: Regex giúp bạn tự động hóa việc tìm kiếm, trích xuất thông tin hoặc thay thế các chuỗi ký tự trong văn bản một cách hiệu quả. Điều này giúp tiết kiệm thời gian và giảm công sức cần thiết cho việc xử lý dữ liệu.
  • Validation dữ liệu đầu vào: Đến nay Regex vẫn được tin dùng để kiểm tra tính hợp lệ của dữ liệu đầu vào. Ví dụ như các chuỗi: email, số điện thoại hay URL có hợp lệ hay không.
  • Cắt, chia và phân tích chuỗi: Regex cho phép bạn cắt, chia và phân tích các chuỗi ký tự thành các phần nhỏ hơn dựa trên các quy tắc mẫu. Điều này rất hữu ích khi bạn cần trích xuất thông tin từ một chuỗi lớn.
  • Đa năng và di động: Cú pháp của Regex không chỉ giới hạn trong một ngôn ngữ lập trình cụ thể. Hầu hết các ngôn ngữ lập trình và môi trường hỗ trợ Regex giúp bạn áp dụng chúng trong nhiều tình huống khác nhau.
  • Tiết kiệm thời gian và công sức: Một Regex tốt có thể thay thế một loạt các công việc tìm kiếm và xử lý chuỗi ký tự phức tạp bằng một vài dòng mã. Điều này giúp bạn tiết kiệm thời gian và giảm nguy cơ mắc lỗi trong quá trình xử lý dữ liệu.

- Xem thêm bài viết về ngôn ngữ lập trình PHP:
- Php developer là gì? Mô tả công việc, lộ trình thăng tiến và mức thu nhập 
- Tìm hiểu về hàm preg_match_all trong PHP 
- Tìm hiểu về ini_set() và cách thiết lập ini_set() trong PHP

2. Dấu ngoặc vuông

Dấu ngoặc vuông [] được sử dụng để xác định phạm vi ký tự trong Regex.

Cú phápMô tả
[0-9]So khớp với bất kỳ chữ số thập phần nào từ 0 đến 9.
[a-z]So khớp với bất kỳ ký tự chữ thường nào trong khoảng từ a đến z.
[A-Z]So khớp với bất kỳ ký tự chữ in hoa nào trong khoảng từ A đến Z.
[a-Z]So khớp với bất kỳ ký tự chữ nào trong khoảng từ a đến Z không quan tâm hoa thường.

Ví dụ:

/**
 * [0-9]
 */
$str = "Stringee2023";
if (preg_match('/[0-9]/', $str)) {
    echo "Chuỗi bao gồm ký tự số thập phân.";
} else {
    echo "Chuỗi không bao gồm ký tự số thập phân.";
}
// Kết quả: Chuỗi bao gồm ký tự số thập phân.

/**
 * [a-z]
 */
$str = "Stringee";
if (preg_match('/[a-z]/', $str)) {
    echo "Chuỗi bao gồm chữ thường.";
} else {
    echo "Chuỗi không bao gồm chữ thường.";
}
// Kết quá: Chuỗi bao gồm chữ thường.

/**
 * [A-Z]
 */
$str = "stringee";
if (preg_match('/[A-Z]/', $str)) {
    echo "Chuỗi bao gồm chữ hoa.";
} else {
    echo "Chuỗi không bao gồm chữ hoa.";
}
// Kết quả: Chuỗi không bao gồm chữ hoa.

/**
 * [a-zA-Z]
 */
$str = "2023";
if (preg_match('/[a-zA-Z]/', $str)) {
    echo "Chuỗi bao gồm chữ cái.";
} else {
    echo "Chuỗi không bao gồm chữ cái.";
}
// Kết quả: Chuỗi không bao gồm chữ cái

3. Số lượng và tần suất xuất hiện

Tần suất hoặc vị trí của các chuỗi ký tự trong ngoặc và các ký tự đơn có thể được biểu thị bằng một ký tự đặc biệt. Mỗi ký tự đặc biệt có một ý nghĩa cụ thể. +, *, ?, {int. range} đều theo sau một chuỗi ký tự. Ta có thể sử dụng các ký tự đặc biệt để xác định tần suất hoặc vị trí của các chuỗi ký tự trong ngoặc và các ký tự đơn. Bạn có thể xem bảng sau để thấy được một số biểu mẫu thường được sử dụng.

Cú phápMô tả
p+Khớp với bất kỳ chuỗi nào có ít nhất 1 ký tự 'p'.
p*Khớp với bất kỳ chuỗi nào không có hoặc có nhiều ký tự 'p'.
p?Khớp với bất kỳ chuỗi nào không có hoặc có 1 ký tự 'p'.
p{N}Khớp với bất kỳ chuỗi nào chứa một chuỗi N ký tự 'p'.
p{2,3}Khớp với bất kỳ chuỗi nào chứa một chuỗi gồm hai hoặc ba chữ 'p'..
p{2,}Khớp với bất kỳ chuỗi nào chứa ít nhất hai chữ 'p'.
p$Khớp với bất kỳ chuỗi nào kết thúc bằng 'p'.
^pKhớp với bất kỳ chuỗi nào bắt đầu bằng 'p'.

Ví dụ:

$str = "Example Regex <b>text</b> php.p";

/**
 * [^\sa-zA-Z]
 */
$pattern1 = '/[^a-zA-Z\s]/';
$result1 = preg_match_all($pattern1, $str, $matches1);
echo json_encode($matches1[0]);
// Kết quả: ["<",">","<","\/",">","."]

/**
 * p.p
 */
$pattern2 = '/p.p/';
$result2 = preg_match_all($pattern2, $str, $matches2);
echo json_encode($matches2[0]);
// Kết quả: ["php"]

/**
 * ^.{2}$
 */
$pattern3 = '/^.{2}$/';
$result3 = preg_match_all($pattern3, $str, $matches3);
echo json_encode($matches3[0]);
// Kết quả: []

/**
 * <b>(.*?)<\/b>
 */
$pattern4 = '/<b>(.*?)<\/b>/';
$result4 = preg_match_all($pattern4, $str, $matches4);
echo json_encode($matches4[0]);
// Kết quả: ["<b>text<\/b>"]

/**
 * p(hp)*
 */
$pattern5 = '/p(hp)*/';
$result5 = preg_match_all($pattern5, $str, $matches5);
echo json_encode($matches5[0]);
// Kết quả: ["p","php","p"]

4. Phạm vị xác định

Với Regex ta có thể xác định một phạm vi ký tự, chẳng hạn như bảng chữ cái hoặc số nguyên.

Cú phápMô tả
[[:alpha:]]Khớp với bất kỳ chuỗi nào chứa các ký tự chữ cái (aA đến zZ).
[[:digit:]]Khớp với bất kỳ chuỗi nào chứa các chữ số (0 đến 9).
[[:alnum:]]So khớp với bất kỳ chuỗi nào chứa các ký tự chữ và số (aA đến zZ và 0 đến 9).
[[:space:]]Khớp với bất kỳ chuỗi nào chứa khoảng trắng.

Ví dụ:

// Mẫu kiểm tra
$alphaPattern = '/[[:alpha:]]/';
$digitPattern = '/[[:digit:]]/';
$alnumPattern = '/[[:alnum:]]/';
$spacePattern = '/[[:space:]]/';

// Các chuỗi kiểm tra
$testStrings = [
    "Stringee",
    "Tích hợp Voice call vào website và ứng dụng của bạn",
    "BẠN CÓ THỂ THỰC HIỆN TÍNH NĂNG NÀY VỚI STRINGEE API\nCHỈ TRONG 15 PHÚT",
    "2023",
    "\t",
    " "
];

// Kiểm tra và hiển thị kết quả
foreach ($testStrings as $string) {
    echo "String: \"$string\"\n";
    echo "Contains alphabetic characters: " . (preg_match($alphaPattern, $string) ? "true" : "false") . "\n";
    echo "Contains digits: " . (preg_match($digitPattern, $string) ? "true" : "false") . "\n";
    echo "Contains alphanumeric characters: " . (preg_match($alnumPattern, $string) ? "true" : "false") . "\n";
    echo "Contains space: " . (preg_match($spacePattern, $string) ? "true" : "false") . "\n";
    echo str_repeat('-', 20) . "\n";
}

/**
 * String: "Stringee"
 * Contains alphabetic characters: true
 * Contains digits: false
 * Contains alphanumeric characters: true
 * Contains space: false
 * --------------------
 * String: "Tích hợp Voice call vào website và ứng dụng của bạn"
 * Contains alphabetic characters: true
 * Contains digits: false
 * Contains alphanumeric characters: true
 * Contains space: true
 * --------------------
 * String: "BẠN CÓ THỂ THỰC HIỆN TÍNH NĂNG NÀY VỚI STRINGEE API
 * CHỈ TRONG 15 PHÚT"
 * Contains alphabetic characters: true
 * Contains digits: true
 * Contains alphanumeric characters: true
 * Contains space: true
 * --------------------
 * String: "2023"
 * Contains alphabetic characters: false
 * Contains digits: true
 * Contains alphanumeric characters: true
 * Contains space: false
 * --------------------
 * String: "	"
 * Contains alphabetic characters: false
 * Contains digits: false
 * Contains alphanumeric characters: false
 * Contains space: true
 * --------------------
 * String: " "
 * Contains alphabetic characters: false
 * Contains digits: false
 * Contains alphanumeric characters: false
 * Contains space: true
 * --------------------
 */

5. Một số hàm và phương thức

  • preg_match(): Tìm kiếm một mẫu trong chuỗi và trả về true nếu tìm thấy, false nếu không.
$string = "Stringee, Tích hợp Voice call vào website và ứng dụng của bạn";
$pattern = "/Stringee/";
if (preg_match($pattern, $string)) {
    echo "Tìm thấy!";
} else {
    echo "Không tìm thấy.";
}
// Kết quả: Tìm thấy!
  • preg_match(): đi kèm với i- Tìm kiếm một mẫu mà không phân biệt hoa thường.
$string = "Stringee, Tích hợp Video call vào website và ứng dụng của bạn";
$pattern = "/video call/i"; // i flag cho phép tìm kiếm không phân biệt hoa thường
if (preg_match($pattern, $string)) {
    echo "Tìm thấy!";
} else {
    echo "Không tìm thấy.";
}
// Kết quả: Tìm thấy!
  • preg_replace(): Tìm kiếm một mẫu và thay thế nếu tìm thấy.
$string = "Stringee, Tích hợp Voice call vào website và ứng dụng của bạn";
$pattern = "/Voice call/";
$replacement = "Video call";
$new_string = preg_replace($pattern, $replacement, $string);
echo $new_string;
// Kết quả: Stringee, Tích hợp Video call vào website và ứng dụng của bạn
  • preg_replace(): đi kèm với i - Tìm kiếm và thay thế không phân biệt hoa thường.
$string = "Stringee, Tích hợp Video call vào website và ứng dụng của bạn";
$pattern = "/video/i";
$replacement = "Voice";
$new_string = preg_replace($pattern, $replacement, $string);
echo $new_string;
// Kết quả: Stringee, Tích hợp Voice call vào website và ứng dụng của bạn
  • preg_split(): Chia một chuỗi thành các phần tử dựa trên một mẫu.
$string = "Stringee, Tích hợp Voice call vào website và ứng dụng của bạn";
$Regex = "/,/";
$split = preg_split($Regex, $string);
print_r($split); // Output: Array ([0] => Stringee)
/**
 * Array
 * (
 *    [0] => Stringee
 *    [1] =>  Tích hợp Voice call vào website và ứng dụng của bạn
 * )
 */
  • preg_split(): đi kèm với i - Chia một chuỗi thành các phần tử không phân biệt hoa thường.
$string = "Stringee, Tích hợp Voice call vào website và ứng dụng của bạn";
$Regex = "/,/i";
$split = preg_split($Regex, $string);
print_r($split);
/**
 * Array
 * (
 *    [0] => Stringee
 *    [1] =>  Tích hợp Voice call vào website và ứng dụng của bạn
 * )
 */

6. Nhược điểm của Regular Expression trong PHP

Với những ưu điểm đã được nói đến trong bài, Regular Expression vẫn tồn tại nhiều nhược điểm mà một lập trình viên có thể gặp phải trong quá trình sử dụng. Sau đây là một số nhược điểm mà bạn cần lưu ý với Regular Expression trong PHP.

  • Phức tạp và khó đọc: Vì biểu thức chính quy nó chỉ là một mẫu các quy tắc, nên đối với các mẫu quá phức tạp nếu chúng ta tổ chức không hợp lý sẽ dễ gây ra các mẫu phức tạp và khó đọc.
  • Hiệu suất không ổn định: Regex tuy rất thuận tiện, nhưng nếu không nắm rõ, dùng một cách không có sự tính toán trước nó có thể khiến cho hiệu suất chương trình bị giảm.
  • Khả năng gây lỗi: Với các biểu mẫu nếu chúng ta cũng có thể gặp các lỗi nếu như viết các mẫu sai.
  • Khả năng quá tải: Các biểu thức phức tạp có thể gây ra thời gian thực thi dài và tốn nhiều tài nguyên, đặc biệt đối với dữ liệu lớn.
  • Khó học và nắm bắt: Việc hiểu và sử dụng biểu thức chính quy đòi hỏi một thời gian để học và làm quen, đặc biệt đối với người mới học.

Tổng kết

Regular Expression trong PHP là một công cụ mạnh mẽ cho việc xử lý và tìm kiếm chuỗi dữ liệu. Tuy nhiên, việc sử dụng chúng đòi hỏi sự hiểu biết và kỹ năng cụ thể. Với khả năng linh hoạt và tính năng tùy chỉnh, biểu thức chính quy là một phần quan trọng trong tủ công cụ của mọi nhà phát triển PHP, giúp họ thực hiện các tác vụ xử lý chuỗi một cách hiệu quả và linh hoạt. Sau bài viết này mong rằng các bạn có thể hiểu thêm về Regular Expression trong PHP và có thể sử dụng chúng một cách tốt nhất để tăng hiệu suất cũng như giảm tải lượng công việc cần xử lý.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: