1. Regular Expression là gì?

Regular Expression (biểu thức chính quy) là một chuỗi các ký tự đặc biệt được sử dụng để xác định một mẫu (pattern) trong văn bản. Nó thường được dùng để kiểm tra, tìm kiếm, thay thế hoặc xử lý chuỗi.

Trong PHP, Regular Expression thường được sử dụng để kiểm tra định dạng email, số điện thoại, hoặc xử lý các trường hợp chuỗi phức tạp. PHP hỗ trợ hai loại biểu thức chính quy:

  • POSIX: Sử dụng các hàm như ereg(), nhưng đã bị loại bỏ từ PHP 5.3.
  • PCRE (Perl-Compatible Regular Expressions): Được sử dụng với các hàm preg_*, đây là loại biểu thức được khuyến nghị sử dụng.

2. Cú pháp Regular Expression cơ bản

Regular Expression có nhiều ký tự và quy tắc đặc biệt để định nghĩa mẫu, dưới đây là các ký tự thông dụng:

2.1 Ký tự đặc biệt

  • .: Đại diện cho bất kỳ ký tự nào.
  • ^: Bắt đầu của chuỗi.
  • $: Kết thúc của chuỗi.
  • *: Lặp lại 0 hoặc nhiều lần ký tự trước.
  • +: Lặp lại 1 hoặc nhiều lần ký tự trước.
  • ?: 0 hoặc 1 lần lặp lại ký tự trước.
  • []: Bộ ký tự, ví dụ [abc] sẽ khớp với a, b, hoặc c.
  • |: Toán tử OR, ví dụ a|b sẽ khớp với a hoặc b.
  • (): Nhóm các mẫu lại với nhau.
  • {n}: Lặp lại chính xác n lần.
  • {n,}: Lặp lại ít nhất n lần.
  • {n,m}: Lặp lại từ n đến m lần.

2.2 Các ký tự đặc biệt khác

  • d: Đại diện cho bất kỳ chữ số nào (tương đương [0-9]).
  • D: Bất kỳ ký tự nào không phải là chữ số.
  • w: Bất kỳ ký tự chữ cái hoặc số, hoặc dấu gạch dưới (tương đương [A-Za-z0-9_]).
  • W: Bất kỳ ký tự nào không phải là chữ cái, số, hoặc dấu gạch dưới.
  • s: Khoảng trắng (space, tab, newline, etc.).
  • S: Bất kỳ ký tự nào không phải là khoảng trắng.

3. Các hàm Regular Expression trong PHP

3.1 preg_match()

Hàm preg_match() được dùng để kiểm tra xem một chuỗi có khớp với mẫu biểu thức chính quy hay không.

Cú pháp:

preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] ) : int

Ví dụ:

$pattern = "/^hello/";
$string = "hello world";
if (preg_match($pattern, $string)) {
    echo "Chuỗi bắt đầu bằng 'hello'";
}

3.2 preg_match_all()

Hàm này tìm tất cả các kết quả khớp với mẫu và trả về chúng trong một mảng.

Ví dụ:

$pattern = "/d+/";
$string = "Có 3 con mèo và 4 con chó";
preg_match_all($pattern, $string, $matches);
print_r($matches);

Kết quả:

Array
(
    [0] => Array
        (
            [0] => 3
            [1] => 4
        )
)

3.3 preg_replace()

Hàm này thay thế các phần chuỗi khớp với biểu thức chính quy bằng một chuỗi khác.

Ví dụ:

$pattern = "/cat/";
$replacement = "dog";
$string = "The cat is on the roof";
echo preg_replace($pattern, $replacement, $string);

Kết quả:

The dog is on the roof

3.4 preg_split()

Hàm này chia chuỗi thành mảng dựa trên mẫu biểu thức chính quy.

Ví dụ:

$pattern = "/[s,]+/";
$string = "apple, orange, banana, pear";
$result = preg_split($pattern, $string);
print_r($result);

Kết quả:

Array
(
    [0] => apple
    [1] => orange
    [2] => banana
    [3] => pear
)

4. Các ví dụ từ cơ bản đến nâng cao

4.1 Kiểm tra định dạng email

$email = "[email protected]";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
    echo "Email hợp lệ";
} else {
    echo "Email không hợp lệ";
}

Biểu thức chính quy (regular expression) $pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/"; được sử dụng để kiểm tra định dạng của địa chỉ email. Dưới đây là phân tích chi tiết từng phần của biểu thức này:

Phần Mở Đầu và Kết Thúc

  • ^: Dấu này chỉ ra rằng kiểm tra bắt đầu từ đầu chuỗi. Điều này có nghĩa là mọi thứ phía trước ký tự đầu tiên phải thỏa mãn quy tắc.
  • $: Dấu này chỉ ra rằng kiểm tra kết thúc ở cuối chuỗi. Điều này có nghĩa là không có ký tự nào khác sau ký tự cuối cùng phải thỏa mãn quy tắc.

Phần Username của Địa Chỉ Email

  • [a-zA-Z0-9._%+-]+: Đây là phần định nghĩa username của email.
    • [a-zA-Z0-9._%+-]: Nhóm này bao gồm tất cả các ký tự hợp lệ cho username:
      • a-z: Các ký tự chữ thường từ a đến z.
      • A-Z: Các ký tự chữ hoa từ A đến Z.
      • 0-9: Các ký tự số từ 0 đến 9.
      • ._%+-: Các ký tự đặc biệt hợp lệ là ., _, %, +, -.
    • +: Dấu cộng này có nghĩa là phần username phải có ít nhất một ký tự, có thể có nhiều ký tự liên tiếp.

Ký Tự @

  • @: Ký tự này yêu cầu phải có trong địa chỉ email, ngăn cách username với domain.

Phần Domain của Địa Chỉ Email

  • [a-zA-Z0-9.-]+: Đây là phần định nghĩa domain.
    • [a-zA-Z0-9.-]: Nhóm này bao gồm:
      • a-z: Các ký tự chữ thường từ a đến z.
      • A-Z: Các ký tự chữ hoa từ A đến Z.
      • 0-9: Các ký tự số từ 0 đến 9.
      • .-: Các ký tự đặc biệt hợp lệ là .-.
    • +: Dấu cộng này yêu cầu phải có ít nhất một ký tự trong phần domain.

Phần TLD (Top-Level Domain)

  • .[a-zA-Z]{2,}: Phần này định nghĩa TLD (ví dụ: .com, .org).
    • .: Ký tự chấm (.) cần phải có, biểu thị sự bắt đầu của TLD.
    • [a-zA-Z]: Chỉ cho phép các ký tự chữ cái từ a đến z hoặc A đến Z.
    • {2,}: Điều này chỉ định rằng TLD phải có ít nhất 2 ký tự (ví dụ: .co, .us, nhưng không phải .a).

Biểu thức chính quy này kiểm tra định dạng địa chỉ email để đảm bảo nó bắt đầu bằng username hợp lệ, sau đó là ký tự @, theo sau là domain hợp lệ, và cuối cùng là một TLD hợp lệ. Nếu một địa chỉ email không thỏa mãn các điều kiện này, nó sẽ không được coi là hợp lệ.

4.2 Kiểm tra số điện thoại Việt Nam

$phone = "0987654321";
$pattern = "/^(09|03|07|08|05)+([0-9]{8})$/";
if (preg_match($pattern, $phone)) {
    echo "Số điện thoại hợp lệ";
} else {
    echo "Số điện thoại không hợp lệ";
}

4.3 Thay thế tất cả khoảng trắng bằng dấu gạch ngang

$string = "The quick brown fox";
$pattern = "/s+/";
$replacement = "-";
echo preg_replace($pattern, $replacement, $string);

Kết quả:

The-quick-brown-fox

4.4 Kiểm tra chuỗi có chứa số

$string = "Tôi có 10 quyển sách";
$pattern = "/d+/";
if (preg_match($pattern, $string)) {
    echo "Chuỗi chứa số";
} else {
    echo "Chuỗi không chứa số";
}

5. Kết luận

Regular Expression trong PHP là một công cụ cực kỳ mạnh mẽ giúp xử lý chuỗi một cách linh hoạt và hiệu quả. Với sự hiểu biết về các cú pháp và hàm cơ bản, bạn có thể áp dụng Regular Expression để kiểm tra dữ liệu đầu vào, xử lý chuỗi, và thực hiện nhiều thao tác phức tạp hơn trong ứng dụng của mình.

Hy vọng qua bài viết này, bạn đã nắm được các kiến thức từ cơ bản đến nâng cao về Regular Expression trong PHP.