Thứ Năm, 29 tháng 9, 2016

PHP nâng cao - Regular expressions trong PHP

Regular expression trong PHP là gì? Lý thuyết dài dòng cũng không nhớ làm gì, hiểu nôm na thì Regular expression là một biểu thức có quy tắc được viết ra để quy định, kiểm tra các chuỗi kí tự khác. Ví dụ bạn muốn check xem người ta nhập địa chỉ mail có đúng không, số điện thoại có đúng định dạng không...
Regular expression trong PHP rất rộng, chúng ta sẽ tìm hiểu có gì đặc biệt

- Một chuỗi các kí tự nhập vào từ bàn phím sẽ có dạng như thế nào? Nó bao gồm các kí tự từ A - Z, kí tự số từ 0 - 9 và các kí tự đặc biệt như là ? / | \ ^ % ...

A. QUY ƯỚC

Trong regular expression quy ước một số biểu thức như sau

1 .  ^ chuỗi kí tự bắt đầu bởi 
1
$str = "/^a/"; // Chuỗi bắt đầu bởi a
2 . $ chuỗi kí tự kết thúc bởi
1
$str = "/b$/"; // Chuỗi kết thúc bởi b
3 . [a-z] , [A-Z], [0-9] ; Cho phép các kí tự từ a-z, A-Z và các chữ số từ 0-9

4 . Dấu . (dấu chấm trong RE) ; dấu chấm trong RE được hiểu là kí tự bất kỳ

5 . Dấu + (dấu cộng); Lặp lại ký tự hay cụm ký tự đứng trước nó
1
2
3
4
a+ : lặp lại chữ a, phải có ít nhất một chữ a
123a ; true
234aa ; true
123; false
6 . Dấu * (dấu sao); Cũng như dấu + nhưng có lặp hoặc không đều được

1
2
3
4
5
a* : lặp lại chữ a, có lặp a hay không đều đúng
 
123a ; true
234aa; true
123; true
7 . Dấu | (gạch đứng) ; Là phép hoặc trong RE, chẳng hạn A hoặc B
1
2
a|b // a hoặc b
a|b|c // a hoặc b hoặc c
8 . Dấu \ (gạc chéo) ; Khi \ đứng trước một kí tự bất kỳ thì kí tự đó dc RE hiểu là chính nó

Ví dụ dấu . (chấm) trong RE được hiểu là kí tự bất kỳ, khi có \ đứng trước thì RE hiểu là dấu chấm chứ ko phải là kí tự bất kỳ 

9 . [^a-zA-Z]: một ký tự không phải là a->z, A-Z
10 . [^0-9]: một ký tự không phải là số
11 . \d Cho phép chuữ số bất kỳ trong khoảng [0-9]

12 . \D Ngược lại với \d , cho phép các kí tự khác [0-9]

13 . \w Cho phép các kí tự từ a-z A-Z và 0-9, hay chính là [a-zA-Z0-9]

14 . {2, 5} ; Thể hiện độ dài kí tự cho phép trong khoảng từ 2-5
1
2
3
4
$str = "/^[a-z]{2,5}$/"; // cho phép a-z có độ dài từ 2-5
$str = "/^[a-z]{5}$/"; // cho phép a-z có độ dài 5 kí tự
$str = "/^[a-z]{2,}$/"; // từ 2 kí tự trở lên
$str = "/^[a-z]{,5}$/"; // nhỏ hơn 5 kí tự
15 . \s cho phép khoảng trắng

16 . \S không cho phép khoảng trắng


B. ÁP DỤNG


Một số hàm so sánh chuỗi trong Regular Expression

1. Hàm preg_match($rule, $str, $result)

- $rule là chuỗi RE do ta quy định
- $str là chuỗi cần so sánh
- $result là kết quả trả về

a. Kiểm tra xem một chuỗi có tồn tại hay không
1
2
3
4
5
6
<?php
if (preg_match("/ell/", "Hello World!", $matches)) {
  echo "Match was found <br />";
  echo $matches[0];
}
?>
- Kết quả : có tìm thấy chuỗi "ell" trong chuỗi "Hello World!"

b. Kiểm tra cụm từ có nằm ở đầu chuỗi hay không
1
2
3
4
5
6
7
8
<?php
$Rule = "/^Hell/";
if (preg_match($Rule, "Hello World!", $matches)) {
  echo "Cụm từ {$Rule} có xuất hiện ở đầu chuỗi";
}else{
 echo "Cụm từ {$Rule} không xuất hiện ở đầu chuỗi";
}
?>
- Kết quả : Cụm từ /^Hell/ có xuất hiện ở đầu chuỗi

c. Kiểm tra xem chuỗi có phải chữ số
  
Kiểm tra xem chuỗi có phải là chữ số và có từ 2 chữ số trở lên hay không
1
2
3
4
5
6
7
8
<?php
$Rule = "/^[0-9]{2,}$/";
if (preg_match($Rule, "Hkgf875565fg", $matches)) {
 echo "{$Rule} là chữ số và có hơn 2 chữ số";
}else{
 echo "{$Rule} không phải là chữ số";
}
?>
- Kết quả : /^[0-9]{2,}$/ không phải là chữ số

d. Kiểm tra password

Kiểm tra password thỏa mãn điều kiện: 
- Kí tự đầu tiên phải là chữ in hoa
- Các kí tự tiếp theo được phép từ a-z A-Z và 0-9
- Độ dài từ 6 - 8 kí tự
1
2
3
4
5
6
7
8
9
<?php
$Rule = "/^[A-Z]{1}[a-zA-Z0-9]{6,8}$/";
$Pass = "Hkg87hjj";
if (preg_match($Rule, $Pass, $matches)) {
    echo "{$Pass} thỏa mãn điều kiện";
}else{
    echo "{$Pass} không phải là password hợp lệ";
}
?>
- Kết quả : Hkg87hjj thỏa mãn điều kiện

e. Kiểm tra email đúng định dạng

- Emai phải bắt đầu bằng kí tự chữ cái a-z => [a-z]{1}
- Tiếp theo được phép các kí tự a-z, A-Z, 0-9 và giới hạn từ 3  - 50 kí tự => [a-zA-Z0-9]{3,50}
- Tiếp theo là dấu @ => \@
- Tiếp theo là miền (gmail, yahoo, domain...) từ 3 - 20 kí tự => [a-zA-Z0-9]{3,20}
- Mail thì phải có dấu chấm (.) => \.
- Cuối cùng là chấm gì  (.com, .net, .vn...) và từ 2 - 5 kí tự => [a-z,A-Z]{2,5}

1
2
3
4
5
6
7
8
$Rule = "/^[a-zA-Z]{1}[a-zA-Z0-9]{3,50}\@[a-zA-Z0-9]{3,20}\.[a-zA-Z]{2,5}$/";
$Myemail = "haanhdon@phpandmysql.net";
if (preg_match($Rule, $Myemail, $matches)) {
 echo "{$Myemail} là một email";
}else{
 echo "{$Myemail} không phải email";
}
?>
2. Hàm preg_replace, tìm kiếm và thay thế
Hàm preg_replace( pattern, replacement, subject)
Hàm preg_replace để tìm kiếm chuỗi và thay thế chuỗi theo một quy ước nào đó, ví dụ ở đây tôi muốn tìm những ngày có định dạng là dd-mm-YY và đổi thành dạng dd/mm/YY
1
echo preg_replace("/(\d+)-(\d+)-(\d+)/", "$1/$2/$3", "17-01-2014");

3. Hàm preg_split
Hàm preg_split dùng để cắt chuỗi trong Regular Expression
1
2
3
4
5
6
7
<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
echo "<pre>";
print_r( $chars );
echo "</pre>";
?>
- Kết quả 
1
2
3
4
5
6
7
8
9
Array
(
    [0] => s
    [1] => t
    [2] => r
    [3] => i
    [4] => n
    [5] => g
)

Hi, ban đầu mới học chắc ai cũng đau đầu với chuỗi kí tự loằng ngoằng này, mặc dù chưa đầy đủ lắm nhưng hi vọng giúp cho các bạn mới học nắm được phần nào về Regular Expression.
nguồn http://phpandmysql.net/


EmoticonEmoticon