DANH MỤC: PHP Regular Expression

Bài 2: Các quy tắc Regular Expression trong PHP


Ở bài trước chúng ta đã tìm hiểu sơ qua về khái niệm Regular Expression rồi, bài này chúng ta sẽ tiếp tục với những lý thuyết tiếp theo của Regular Expression và kèm theo với thực hành của từng phần.

1, Hàm preg_match.

-Hàm này dùng để kiểm tra so khớp dữ liệu đầu vào và chuỗi Regular Expression có pass không và trả về kết quả.

Cú Pháp:

preg_match($pattern, $subject, $match, $flags, $offset);

Trong đó:

  • $pattern là chuỗi Regular Expression.
  • $subject là chuỗi cần so khớp.
  • $match là kết trả về, được truyền vào dưới dạng tham chiếu (có thể bỏ trống).
  • $flags là tham số  chỉ ra vị trí cắt chuỗi so khớp (có thể bỏ trống).
  • $offset là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi (có thể bỏ trống).

VD: So sánh xem chuỗi có tồn tại đoạn 'toidicode' hay không?

<?php
$check = preg_match('/toidicode/','toidicode.com');
if ($check) {
    echo 'Chuỗi khớp';
} else {
    echo 'Chuỗi không khớp';
}
//Kết Quả: Chuỗi khớp.

VD: Kiểm tra xem một chuỗi có phải là toàn chữ hay không?

<?php
$check = preg_match('/^[a-zA-Z]+$/','ToiDiCode');
if ($check) {
    echo 'Chuỗi khớp';
} else {
    echo 'Chuỗi không khớp';
}
//Kết quả: Khớp.

2, Khai báo chuỗi pattern.

- Để khai báo chuỗi Regular Expression thì các bạn phải luôn nhớ đặt chúng trong cặp dấu '/'.

VD: So sánh trong chuỗi có tồn tại pattern. 

<?php
$string = 'toidicode.com';
$pattern = '/toi/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp.

-Nếu như trong trường hợp bạn muốn so khớp toàn bộ chuỗi thì bạn cần sử dụng cặp dấu:

  • ^ bắt đầu.
  • $ kết thúc.

VD: Cũng với ví dụ trên nhưng giờ mình sẽ chuyển sang so khớp toàn bộ chuỗi.

<?php
$string = 'toidicode.com';
$pattern = '/^toi$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: Không khớp.

3, Các khuôn mẫu regex.

-Để sử dụng các khuôn mẫu chuỗi chúng ta sử dụng trong cặp dấu [].

  • Nếu như bạn muốn cho phép các ký tự từ min đến max thì bạn chỉ cần điền chúng giữa dấu -  theo quy tắc [min-max].
  • Nếu như bạn chỉ muốn cho phép các ký tự được liệt kê thì bạn chỉ cần liệt kê các ký tự vào trong cặp [].

-Dưới đây là các khuôn mẫu cơ bản

Regex Mô tả
[a-z] Chỉ cho phép nhập vào các chuỗi in thường từ a đến z
[A-Z] Chỉ cho phép nhập vào các chuỗi in hoa từ a đến z.
[0-9] Chỉ cho phép nhập vào các số từ 0 đến 9.

Các ví dụ.

Regex chỉ nhận chữ in thường.

<?php
$string = 'a';
$pattern = '/^[a-z]$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: khớp.

Regex chỉ nhận chữ in hoa.

<?php
$string = 'B';
$pattern = '/^[A-Z]$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: khớp.

Regex chỉ nhận số.

<?php
$string = 5;
$pattern = '/^[0-9]$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: khớp.

Regex chỉ nhận số và chuỗi in thường.

<?php
$string = 5;
$pattern = '/^[a-z0-9]$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: khớp.

4, So khớp chuỗi và độ dài chuỗi.

-Để có thể so sánh khớp chuỗi và độ dài của chuỗi thì các bạn chỉ cần thêm cú pháp {begin, end} vào sau khuôn mẫu của regex.

VD: So sánh từ chuỗi xem có phải chỉ chứa chữ in thường và có độ dài từ 3 đến 5 ký tự hay không?

<?php
$string = 'taivu';
$pattern = '/^[a-z]{3,15}$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: khớp.

-Và nếu như bạn muốn kiểm tra độ dài chuẩn của chuỗi thì bạn chỉ cần bớt đi một tham số trong cặp {}.

VD: So sánh xem chuỗi hiện tại có phải chỉ chứa các chữ in thường và dài 10 ký tự hay không?

<?php
$string = 'vuthanhtai';
$pattern = '/^[a-z]{10}$/';
if (preg_match($pattern, $string)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả: khớp.

5, Ký tự đặc biệt trong Regex.

. đại diện cho ký tự bất kỳ.

-Trong regex nếu như bạn muốn pattern cả chữ, số và ký tự thì bạn chỉ cần đặt dấu . - dấu . này  đại diện cho ký tự có thể là chuỗi, số, ký tự.

VD:

<?php 
$pattern = '/./';
$subject = '!#$@$@%#$%#%';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp

+ đại diện cho một hoặc nhiều ký tự.

VD: Kiểm tra xem trong chuỗi có tồn tại ít nhất một chữ số hay không?

<?php 
$pattern = '/[0-9]+/';
$subject = '!#$@$@%9#$%#%';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp

* đại diện cho không hoặc nhiều ký tự.

VD: Kiểm tra xem chuỗi này có phải trống hoặc chỉ có số hay không?

<?php 
$pattern = '/[0-9]*/';
$subject = '';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp

\d đại diện cho chữ số bất kỳ (tương đương với [0-9])

VD: Kiểm tra xem chuỗi có phải chứa toàn số không.

<?php 
$pattern = '/\d+/';
$subject = '9';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp

\D đại diện cho phủ định của chữ số.

VD: Kiểm tra một chuỗi không phải là số.

<?php 
$pattern = '/\D/';
$subject = '5444466';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả Không khớp

\s một ký tự khoảng trắng.

-Ký tự khoảng trắng này bao gồm (space, tab, newline,)

VD: kiểm tra xem chuỗi có khoảng trắng không?

<?php 
$pattern = '/\s/';
$subject = '5444 466';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp

\S không chứa khoảng trắng.

-Đây là phủ định của \s.

VD: kiểm tra chuỗi không có khoảng trắng.

<?php 
$pattern = '/\S/';
$subject = 'hhj';
if (preg_match($pattern, $subject)) {
    echo 'Khớp';
} else {
    echo 'Không khớp';
}
//Kết quả khớp

Các pattern khác.

Regex Mô tả
[[:alpha:]]  So khớp với chuỗi nào chứa các ký tự chữ cái (cả in hoa và in thường).
[[:digit:]] So khớp với chuỗi nào chứa các chữ số từ 0 tới 9.
[[:alnum:]] Gộp của [[:alpha:]][[:digit:]]
[[:space:]] So khớp với chuỗi nào chứa một khoảng trắng.
\w Một ký tự từ a-z hoặc A-Z hoặc 0-9.
\W Phủ định của \w

6, Lời kết.

-Ngoài những quy tắc phía trên thì vẫn còn vài quy tắc nữa nhưng rất ít khi sử dụng nên mình không nhắc đến ở đây. Các bạn chú ý giúp mình phần này vì nó khá là quan trọng và sẽ được sử dụng rất là nhiều khi làm các dự án có sự tương tác với người dùng.

Nguồn: Toidicode.com

Thông tin tác giả

Thanh Tai (thanhtaivtt)

Thanh Tai (thanhtaivtt)

The best way to learn is to teach

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia