06/04/2021, 14:46

Các quy tắc Regular Expression căn bản - Học Regular Expression PHP

Ta có thể hiểu nôm na rằng Regular Expression hoạt động theo kiểu so khớp và trả về kết quả giống nhau của sự so khớp đó. Ví dụ bạn làm bánh thì cái khuông chính là biểu thức Regular Expression còn còn bánh được làm ra chính là sản phẩm của sự so khớp giữa bột vài cái khuông. Trước tiên để dễ ...

Ta có thể hiểu nôm na rằng Regular Expression hoạt động theo kiểu so khớp và trả về kết quả giống nhau của sự so khớp đó. Ví dụ bạn làm bánh thì cái khuông chính là biểu thức Regular Expression còn còn bánh được làm ra chính là sản phẩm của sự so khớp giữa bột vài cái khuông.

Trước tiên để dễ hiểu ta quy định một số danh từ nhé.

  • pattern: được gọi là chuỗi Regular Expression (biểu thức chính quy)
  • subject: chuỗi so khớp với pattern
  • matches: kết qua so khớp

Đây chính là ba tham số của hàm preg_match mà ở bài trước ta đã tìm hiểu.

1. Khai báo chuỗi RegEx

Để khai báo một chuỗi Regular Expression ta chỉ cần khai báo bắt đầu bằng ký tự / và kết thúc cũng là ký tự /.

Ví dụ:

// Partern kiểm tra trong subject có tồn tại chuỗi abc không
$pattern = '/abc/';
$subject = 'abc';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Trong ví dụ này chuỗi $pattern = '/abc/' có ý nghĩa là tìm trong chuỗi $subject xem có tồn tại chuỗi abc không. Vì $subject = 'abc' nên kết quả hàm preg_match trả về kết quả đúng.

Giả sử giờ tôi thay đổi giá trị của $subject như sau thì theo bạn kết quả trả về đúng hay sai nhé:

// Partern kiểm tra trong subject có tồn tại chuỗi abc không
$pattern = '/abc/';
$subject = 'mabcd';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Kết quả trả về vẫn là đúng tại vì trong $subject tuy có giá trị là mabcd nhưng tách nhỏ ra thì nó tồn tại chuỗi abc nên kết quả so khớp là đúng.

2. Ký tự bắt đầu và kết thúc RegEx

Trong lập trình để kiểm tra hai biến có chính xác bằng nhau hay không thì đơn giản ta chỉ cần dùng toán tử so sánh ==. Còn trong Regular Expression có làm được điều này không? Hoàn toàn được nhé các bạn, ta sẽ dùng ký tự bắt đầu ^ và ký tự kết thúc $ đặt vào đầu và cuối chuỗi $pattern, như vậy khi so khớp sẽ so sánh từ đầu đến cuối, tức là so sánh khớp hoàn toàn.

Ví dụ:

// Partern kiểm tra trong subject co bang Zaidap.com khong
$pattern = '/^Zaidap.com$/';
$subject = 'Zaidap.com';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Trong ví dụ này chuỗi $pattern = '/^Zaidap.com$/' sẽ kiểm tra xem chuỗi $subject có bằng Zaidap.com.net không, vì $subject = 'Zaidap.com' nên kết quả trả về là đúng. Giả sử giờ bạn thay đổi biến $subject = 'sZaidap.comd' thì kết quả sẽ sai, tại vì $subject tuy xuất hiện chữ Zaidap.com nhưng ký tự bắt đầu lại là chữ s chứ không phải chứ f và ký tự kết thúc là chữ d chứ không phải chữ s.

Nếu tới đây bạn vẫn chưa hiểu thì tôi giải thích tiếp như sau, chuỗi $pattern = '/^Zaidap.com$/' có ý nghĩa rằng:

  • Ký tự thứ 1 là chữ f và là ký tự bắt đầu chuỗi
  • Ký tự thứ 2 phải là chữ r
  • ký tự thứ 3 phải là chữ e
  • ...
  • ký tự thứ 7 phải là chữ t
  • ký tự thứ 8 phải là chữ s và là ký tự kết thúc chuỗi

3. RegEx phạm vi của chuỗi

Giả sử cần kiểm tra một chuỗi có phải là chữ cái in thường hay không thì ta sẽ dùng ký hiệu [min-max], trong đó min là ký tự bắt đầu, max là ký tự kết thúc. Hoặc [list_char] trong đó list_char là danh sách các ký tự cho phép.

Sau đây là các ví dụ cách sử dụng phạm vi của chuỗi Regular Expression.

Regex kiểm tra có phải chữ cái in thường

// Pattern là chữ cái từ a -> z
$pattern = '/[a-z]/';
$subject = 'd';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Regex kiểm tra một chữ cái in hoa

// Pattern là chữ cái từ A -> Z
$partern = '/[A-Z]/';
$subject = 'd';
if (preg_match($partern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Regex kiểm tra một ký tự là chữ số

// Pattern là chữ cái từ 0 -> 9
$pattern = '/[0-9]/';
$subject = 'd';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Regex kiểm một chữ cái in hoa hoặc in thường

// Partern là ký tự in hoa hoặc in thường
$partern = '/[a-zA-Z]/';
$subject = 'f';
// $subject = 'F';
if (preg_match($partern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Regex kiểm tra một ký tự là số, chữ cái in hoa hoặc in thường

// Pattern là số, ký tự in hoa hoặc in thường
$pattern = '/[a-zA-Z0-9]/';
$subject = 'f';
//$subject = 'F';
//$subject = '9';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Regex kiểm tra ký tự có nằm trong dãy không

// Pattern là chữ a hoặc số 2 hoặc chữ b
$pattern = '/[a2b]/';
$subject = 'a';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Trong ví dụ này ta không sử dụng cú pháp [min, max] để định nghĩa nên Regular Expression sẽ hiểu là một trong các ký tự, tức là nếu:

  • $subject có chứa ký tự a
  • $subject có chứa ký tự 2
  • $subject có chứa ký tự b

thì regex sẽ trả về đúng.

4. Xác định chiều dài của chuỗi Regex

Để xác định chiều dài của chuỗi pattern Regex ta dùng ký hiệu {min,max}, trong đó min là chiều dài tối thiểu và max là chiều dài tối đa.

Regex kiểm tra là chữ in thường dài từ 5 đến 10 ký tự

$pattern = '/^[a-z]{5,10}$/';
$subject = 'fdsfdsa';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Trong ví dụ này chạy lên kết quả sẽ trả về đúng. Tuy nhiên nếu bạn đổi giá trị biến $subject = 'a' thì kết quả sẽ trả về sai tại vì chiều dài chuỗi $subject chỉ bằng 1.

Regex kiểm tra là chữ số dài 3 đến 10 ký tự.

// Pattern là chữ số từ 3 đến 10 ký tự
$pattern = '/^[0-9]{3,10}$/';
$subject = '3232';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Regex kiểm tra chuỗi có độ dài chính xác

Giả sử ta có bài toán kiểm tra một chuỗi có phải là chữ in thường dài 5 ký tự không? Ta có 2 cách để xử lý vấn đề này:

Cách 1: dùng cách thông thường $partern = '/^[a-z]{5,5}$/'

// Pattern là chữ thường dài 5 ký tự
$pattern = '/^[a-z]{5,5}$/';
$subject = 'sssss';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Cách 2: Ta dùng cú pháp bình thường nhưng bớt đi một biến.

// Pattern là chữ thường dài 5 ký tự
$pattern = '/^[a-z]{5}$/';
$subject = 'sssss';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

5. Lời kết

Trong bài này chúng ta đã tìm hiểu được một số biểu thức quan trọng trước khi vào học nâng cao, những biểu thức này đang chỉ ở mức căn bản nhưng nó là tiền đề để bạn hiểu và kết hợp với những kiến thức nâng cao mà mình sắp trình bày ở các bài tiếp theo.

Tạ Quốc Bảo

23 chủ đề

7270 bài viết

0