1. Giới thiệu
Regular Expression là gì?
+ Biểu thức chính quy.
+ Hiểu nôm na là 1 chuỗi có quy tắc để mô tả những chuỗi(string) khác.
Làm việc với string thường rất vất vả và đòi hỏi độ chính xác cao. với Regular Expression trong PHP, công việc này được đơn giản đi rất nhiều. 1 dòng code trong PHP làm việc với string trong trường hợp này có thể sánh với hàng trang code trong các ngôn ngữ khác.
Ta có thể ứng dụng những đoạn code đơn giản ở trên vào các form đòi hỏi nhập dữ liệu, thông tin người dùng, ... hay dùng để lọc các biến được truyền.
2. Hàm preg_match trong PHP
Trong PHP có một hàm là preg_mathch(string pattern, string subject). Hàm này trả về 1 nếu đúng quy tắc so mẫu, trả về 0 nếu sai quy tắc so mẫu.
Với:
string pattern: là biểu thức dùng để so mẫu. Các chuỗi được so mẫu phải tuân thủ quy tắc của biểu thức này.
string subject: là chuỗi được so mẫu.
Một pattern (biểu thức so mẫu) có dạng:
Biểu thức so mẫu nằm giữa hai dấu "/", và hai dấu "/" này nằm trong cặp nháy đôi.
Để viết regular expression ta cần làm quen với những ký tự có ý nghĩa đặc biệt trong một regular expression đó là các Meta symbols
Ví dụ:
$patern = "/.../"; (trong dấu...ta thay các biểu thức sau)
^a : Bắt đầu của dòng là ký tự a. Dòng này có thể là abcd, aaaa, a4684,.... miến sao bắt đầu bằng ký tự a.
^string$ : Dòng này mang giá trị cứng là string vì nó bị chặn giữa ^ và $. Nghĩa là chỉ có chữ string mới đúng, còn lại thì sai hết.
Từ bây giờ thì ta sẽ sử dụng: $pattern = "/^...$/"; ^ :bắt đầu một dòng, $ :kết thúc một dòng
a. :có thể mang giá trị: ab, a1, au, af .Nhưng không thể là abc, ab1, vì dấu . chi đại diện cho một ký tự!
ax+ :biểu diễn cho dòng: ax, axx, axxxx - nhưng không thể là "a" vì + đại diện cho >=1 ký tự.
ay* :biểu diễn cho dòng: a, ay, ayy, ayyyyyyyyy,....
ab? :biểu diễn cho: a, ab (b có thể có hoặc không)
a\+b :biểu diễn cho dòng: "a+b"
Cách biểu diễn số và chữ cái
Ví dụ:
Ví dụ:
Ví dụ:
Nghĩa là chỉ chứa các ký tự đặc biệt
Ví dụ:
Ví dụ:
Ý nghĩa các dấu ngoặc tròn, ngoặc nhọn, ngoặc vuông
Ví dụ:
Ví dụ:
Ví dụ:
Ví dụ:
3. Hàm preg_replace trong PHP
Hàm này dùng để tìm một string theo quy tắc và thay thế string đó theo mình muốn.
Cú pháp:
preg_replace(mixed regex, mixed replace, mixed subject);
mixed regex: biểu thức so mẫu
mixed replace: mẫu thay thế.
mixed: chuỗi mẹ
Ví dụ:
Tìm chuỗi 123 và gạch dưới nó. Kết quả abc 123 efg
Chú ý:
- Cứ 1 nhóm trong dấu ngoặc tròn được đại diện bằng các biến $ là được đánh dấu lần lượt từ trái sang phải, bắt đầu là $1, tiếp theo là $2 , $3...
- Nếu thay thế nó bằng một cái khác thì không có $1, $2, $3...Còn nếu chỉ thay đổi nó thì dùng $1, $2, $3.. như ví dụ ở trên.
Ví dụ
Tìm <div id='teo'> Nguyen Van Teo </div> và thay đổi nó thành <b><u>Nguyen Van Teo</u></b>
Lưu ý:
Biểu thức so mẫu viết liền, không khoảng trắng. Nếu chuỗi mẹ có khoảng trắng thì mình thêm vào biểu thức so mẫu là (\s+). Khi đó nhớ đếm cụm dấu ngoặc để xác định biến $ cho chính xác.
4. Hàm preg_split trong PHP
Hàm này có tác dụng cắt chuỗi giống như hàm explore, nhưng hàm explore phải kiếm đúng theo ký tự, còn hàm này kiếm theo quy tắc
Cú pháp:
string pattern: biểu thức so mẫu
string subject: chuỗi mẹ
Chú ý: hàm này trả về một mảng
Ví dụ:
Regular Expression là gì?
+ Biểu thức chính quy.
+ Hiểu nôm na là 1 chuỗi có quy tắc để mô tả những chuỗi(string) khác.
Làm việc với string thường rất vất vả và đòi hỏi độ chính xác cao. với Regular Expression trong PHP, công việc này được đơn giản đi rất nhiều. 1 dòng code trong PHP làm việc với string trong trường hợp này có thể sánh với hàng trang code trong các ngôn ngữ khác.
Ta có thể ứng dụng những đoạn code đơn giản ở trên vào các form đòi hỏi nhập dữ liệu, thông tin người dùng, ... hay dùng để lọc các biến được truyền.
2. Hàm preg_match trong PHP
Trong PHP có một hàm là preg_mathch(string pattern, string subject). Hàm này trả về 1 nếu đúng quy tắc so mẫu, trả về 0 nếu sai quy tắc so mẫu.
Với:
string pattern: là biểu thức dùng để so mẫu. Các chuỗi được so mẫu phải tuân thủ quy tắc của biểu thức này.
string subject: là chuỗi được so mẫu.
Một pattern (biểu thức so mẫu) có dạng:
$pattern = "/ thiết_lập quy_tắc_ở đây /"; |
Biểu thức so mẫu nằm giữa hai dấu "/", và hai dấu "/" này nằm trong cặp nháy đôi.
Để viết regular expression ta cần làm quen với những ký tự có ý nghĩa đặc biệt trong một regular expression đó là các Meta symbols
Meta Symbols | Ý nghĩa |
^ | Bắt đầu dòng (string) |
$ | Kết thúc dòng (string) |
. | Đại diện cho một ký tự bất kỳ |
+ |
Lặp lại ký tự hay cụm ký tự đứng trước nó (>=1) Ví dụ: a+ : nghĩa là lặp lại chữ a và phải có ít nhất là một chữ a. Do vậy mới ghi >=1 cho dễ hiểu. - 123a: 1(đúng) - 123aa: 1(đúng) - 123 : 0(sai). vì không có chữ a nào được lặp. |
* |
Cũng là lặp lại ký tự hay cụm ký tự đứng trước nó (>=0) Ví dụ: a* : nghĩa là lặp lại chữ a, nếu không có chữ a cũng không sao. Do vậy mà >=0 -123a: (1) -123aaa: (1) -123: (1). Không có chữ a cũng không sao. |
? | Tồn tại hay không tồn tại ký tự hay cụm ký tự đứng trước nó |
\ | Dấu \ đi kèm với 1 meta symbol sẽ làm mất ý nghĩa của meta symbol đó - trả về symbol bình thường. |
Ví dụ:
$patern = "/.../"; (trong dấu...ta thay các biểu thức sau)
^a : Bắt đầu của dòng là ký tự a. Dòng này có thể là abcd, aaaa, a4684,.... miến sao bắt đầu bằng ký tự a.
^string$ : Dòng này mang giá trị cứng là string vì nó bị chặn giữa ^ và $. Nghĩa là chỉ có chữ string mới đúng, còn lại thì sai hết.
Từ bây giờ thì ta sẽ sử dụng: $pattern = "/^...$/"; ^ :bắt đầu một dòng, $ :kết thúc một dòng
a. :có thể mang giá trị: ab, a1, au, af .Nhưng không thể là abc, ab1, vì dấu . chi đại diện cho một ký tự!
ax+ :biểu diễn cho dòng: ax, axx, axxxx - nhưng không thể là "a" vì + đại diện cho >=1 ký tự.
ay* :biểu diễn cho dòng: a, ay, ayy, ayyyyyyyyy,....
ab? :biểu diễn cho: a, ab (b có thể có hoặc không)
a\+b :biểu diễn cho dòng: "a+b"
Cách biểu diễn số và chữ cái
\d : Biểu diễn một con số bất kỳ. |
Ví dụ:
$reg5="/^\d$/"; // chi co 1 chu so $reg5a="/^\d\d$/"; // chi co 2 chu so $reg5b = "/^10A\d\d\d\d\d\d$/"; // 10A123456
\D : Ký tự bất kỳ không phải là chữ số (ngược với \d) |
Ví dụ:
$reg = "/^\D$/"; // bieu dien mot ky tu bat kỳ khong phai la so $reg ="/^\d\D\d\D$/"; bieu dien mọt chuoi co dang 1a2b. Với a,b là ký tự bất kỳ khong phai la so
\w - Ký tự từ a-z, A-Z, hoặc 0-9 |
Ví dụ:
$reg6 = "/^\w\w\w$/"; // chi gom 3 ky tu từ a->z, A->Z, 0->9. Khong co ky tu dac biet $reg7 ="/^\w+\@\w+\.\w+$/"; // kiem tra email teo@yahoo.com
\W - Ngược lại với \w (nghĩa là các ký tự không thuộc các khoảng: a-z, A-Z, hoặc 0-9) |
Nghĩa là chỉ chứa các ký tự đặc biệt
Ví dụ:
$reg = "/^\W$/"; // chua mọt ký tu khong thuoc tù a-z , A-Z, 0-9
\s+ - Có nghĩa: có >=1 khoảng trắng. |
Ví dụ:
$reg ="/^\w+\s\d+$/"; // bieu dien a 1, g 22, abc 123
Ý nghĩa các dấu ngoặc tròn, ngoặc nhọn, ngoặc vuông
Ngoặc tròn: () : dùng để gom các ký tự thành một nhóm |
Ví dụ:
$reg = "/^\d(ab)+$/"; bieu dien 1ab, 1abab, 1ababab. Lặp lại ab vô hạn
Ngoặc nhọn {}: dùng để lặp ký tự hay cụm ký tự đứng trước nó với số lượng xác định + {3}: lặp lại chỉ 3 lần. + {3,}: lặp lại >=3. + {3,10}: lặp lại từ 3 đến 10 lần. |
Ví dụ:
$reg8 = "/^\d{3}$/"; // lap chi 3 so $reg8a = "/^\d{3,}$/"; // lap >=3 $reg9 = "/^a(xy){2,}$/"; // lap xy toi thieu tu 2 lan tro len $reg9a = "/^a(xy|12){2,}$/"; // lap xy hoac 12 toi thieu 2 lan tro len
Dấu gạch thẳng đứng để lựa chọn hoặc cái này hoặc cái kia |
Ví dụ:
$reg16 = "/^[a-zA-Z0-9]+\.(jpg|png|gif|jpeg|JPG|PNG|GIF|JPEG)$/"; // kiem tra file hinh co duoi khac nhau
Dấu ngoặc vuông để chỉ đoạn ký tự cho phép + [a-z] : chỉ các chữ từ a đến z + [A-Z] : chỉ các chữ từ A đến Z + [0-9] : chỉ các số từ 0-9 + [a-zA-z0-9] : các chữ từ a-z, A-Z, 0-9 |
Ví dụ:
$reg13 = "/^[3-7]$/"; // chi co 1 so trong khoang tu 3 den 7
3. Hàm preg_replace trong PHP
Hàm này dùng để tìm một string theo quy tắc và thay thế string đó theo mình muốn.
Cú pháp:
preg_replace(mixed regex, mixed replace, mixed subject);
mixed regex: biểu thức so mẫu
mixed replace: mẫu thay thế.
mixed: chuỗi mẹ
Ví dụ:
preg_replace("/(\d{3})/","<u>$1</u>","abc 123 efg");
Tìm chuỗi 123 và gạch dưới nó. Kết quả abc 123 efg
Chú ý:
- Cứ 1 nhóm trong dấu ngoặc tròn được đại diện bằng các biến $ là được đánh dấu lần lượt từ trái sang phải, bắt đầu là $1, tiếp theo là $2 , $3...
- Nếu thay thế nó bằng một cái khác thì không có $1, $2, $3...Còn nếu chỉ thay đổi nó thì dùng $1, $2, $3.. như ví dụ ở trên.
Ví dụ
preg_replace("/^\<div(\s+)(id\=\'teo\')?\>(\s+)?(.*)(\s+)?\<\/div\>$/","<b><u>$4</u></b>","<div id='teo'> Nguyen Van Teo </div>");
Tìm <div id='teo'> Nguyen Van Teo </div> và thay đổi nó thành <b><u>Nguyen Van Teo</u></b>
Lưu ý:
Biểu thức so mẫu viết liền, không khoảng trắng. Nếu chuỗi mẹ có khoảng trắng thì mình thêm vào biểu thức so mẫu là (\s+). Khi đó nhớ đếm cụm dấu ngoặc để xác định biến $ cho chính xác.
4. Hàm preg_split trong PHP
Hàm này có tác dụng cắt chuỗi giống như hàm explore, nhưng hàm explore phải kiếm đúng theo ký tự, còn hàm này kiếm theo quy tắc
Cú pháp:
preg_split(string pattern, string subject); |
string pattern: biểu thức so mẫu
string subject: chuỗi mẹ
Chú ý: hàm này trả về một mảng
Ví dụ:
$macth = preg_split("/\#/","abc#123#efg"); print_r($macth);
Cám ơn bạn. Bài viết khá hay.
Trả lờiXóathật tuyệt vời, cảm bạn bạn nhé!
Trả lờiXóaBài viết rất dễ hiểu. Very good
Trả lờiXóaCảm ơn, bài viết rất tuyệt vời
Trả lờiXóathank, bài viết tuyệt vời
Trả lờiXóaCám ơn bạn
Trả lờiXóa