Bài 3
Một số kỹ thuật lập trình PHP nâng cao
Cách tạo một biểu thức chính quy và xử lý bằng
hàm preg_match
Cách sử dụng biểu thức chính quy nhiều dòng,
toàn cục
Cách sử dụng hàm preg_replace và preg_split
để làm việc với biểu thức chính quy
Cơ chế sử dụng biểu thức chính quy trong xác
thực dữ liệu
Cơ chế tạo, ném và xử lý ngoại lệ
Mục tiêu
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
2
Tạo và sử dụng biểu thức chính quy
So khớp các ký tự
Sử dụng lớp ký tự
Tạo chuỗi mẫu (pattern)
Sử dụng xác nhận trước (look-ahead assertion)
Sử dụng biểu thức chính quy nhiều dòng
Sử dụng biểu thức chính quy toàn cục
Thay thế biểu thức chính quy bằng một xâu
Làm việc với biểu thức chính quy
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
3
Hàm so khớp biểu thức chính quy:
Cách tạo một biểu thức chính quy:
Hai xâu để kiểm tra:
Cách tìm chuỗi:
Biểu thức chính quy
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
4
preg_match($pattern, $string)
$pattern = '/Harris/';
$author = 'Ray Harris';
$editor = 'Joel Murach';
$author_match = preg_match($pattern, $author);
$editor_match = preg_match($pattern, $editor);
Kiểm tra lỗi
trong biểu thức chính quy
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
5
if ($author_match === false) {
echo 'Error testing author name';
} else if ($author_match === 0) {
echo 'Author name does not contain Harris';
} else {
echo 'Author name contains Harris';
}
Một biểu thức chính quy không phân biệt chữ
hoa hay chữ thường:
Cách sử dụng:
Biểu thức chính quy
không phân biệt chữ hoa hay thường
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
6
$pattern = '/murach/i';
$editor = 'Joel Murach';
$editor_match = preg_match($pattern, $editor);
Khái niệm biểu thức chính quy (regular
expression)
Khái niệm chuỗi mẫu (pattern)
Chuỗi mẫu cho các ký tự đặc biệt:
Chuỗi mẫu (pattern)
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
7
Chuỗi
mẫu
Ý
nghĩa
\
\
Ký
tự \
\
/
Ký
tự /
\
t
Tab
\
n
Dòng
(line) mới
\
r
Quay
lại
\
f
Form feed
\
xhh
Ký
tự Latin-1 với giá trị là hai chữ số hệ
thập
phân
So khớp các ký tự đặc biệt
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
8
$string = "© 2010 Mike's Music. \ All rights reserved
(5/2010).";
preg_match('/\xA9/', $string);
//So khớp © và trả về 1
preg_match('///', $string);
//Trà về false và đưa ra cảnh báo
preg_match('/\/', $string);
//So khớp / và trả về 1
preg_match('/\\\\/', $string);
//So khớp \ và trả về 1
Chuỗi
mẫu
Ý
nghĩa
.
Bất
kỳ ký tự đơn nào ngoại trừ ký tự dòng mới
\
w
Bất
kỳ chữ cái, số và dấu _
\
W
Bất
kỳ ký tự nào ngoại trừ chữ cái, số và dấu _
\
d
Bất
kỳ chữ số nào
\
D
Bất
kỳ ký tự nào ngoại trừ chữ số
\
s
Bất
kỳ khoảng trắng nào (tab, dấu cách, dòng mới, …)
\
S
Bất
kỳ ký tự nào ngoại trừ khoảng trắng
Chuỗi mẫu cho các loại ký tự
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
9
Các loại ký tự so khớp
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
10
$string = 'The product code is MBT-3461';
preg_match('/MB.', $string);
//So khớp MBT và trả về 1
preg_match('/MB\d', $string);
//Không so khớp gì và trả về 0
preg_match('/MBT-\d', $string);
//So khớp MBT-3 và trả về 1
Sử dụng lớp ký tự
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
11
$string = 'The product code is MBT-3461';
preg_match('/MB[TF]', $string);
//So khớp MBT và trả về 1
preg_match('/[.]/', $string);
//So khớp . và trả về 1
preg_match('/[13579]/', $string);
//So khớp 3 và trả về 1
Sử dụng
các siêu ký tự (metacharacter)
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
12
preg_match('/MB[^TF]', $string);
//Không so khớp gì và trả về 0
preg_match('/MBT[^^]/', $string);
//So khớp MBT- và trả về 1
preg_match('/MBT-[1-5]/', $string);
//So khớp MBT-3 và trả về 1
preg_match('/MBT[_*-]/',$string);
//So khớp MBT- và trả về 1
Sử dụng dấu ngoặc
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
13
preg_match('/MB[[:punct:]]', $string);
//So khớp MBT- và trả về 1
preg_match('/MBT[[:digit:]]/', $string);
//Không so khớp gì và trả về 0
preg_match('/MB[[:upper:]]/', $string);
//So khớp MBT và trả về 1
Chuỗi
mẫu
Ý
nghĩa
^
Bắt
đầu xâu
$
Kết
thúc xâu
\
b
Bắt
đầu hoặc kết thúc một từ (không nằm trong ngoặc)
\
B
Vị
trí không phải là bắt đầu hoặc kết thúc một từ
Chuỗi mẫu cho vị trí xâu
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
14
So khớp vị trí xâu
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
15
$string = 'Ray Harris';
preg_match('/^Ray/', $string);
//Trả về 1
preg_match('/Harris$/', $string);
//Trả về 1
preg_match('/^Harris/', $string);
//Trả về 0
$editor = 'Anne Boehm';
preg_match('/Ann/',$editor);
//Trả về 1
preg_match('/Ann\b/', $editor);
//Trả về 0
So khớp chuỗi mẫu con
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
16
$name = 'Rob Rebertson';
preg_match('/^(Rob)|(Bob)b/', $name);
//Trả về 1
preg_match('/^(\w\w\w) \1/', $name);
//Trả về 1
So khớp các chuỗi mẫu lặp lại
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
17
$phone = '559-555-6627';
preg_match('/^d{3}-\d{3}-\d{4}$/', $phone);
//Trả về 1
$fax = '(559) 555-6635';
preg_match('/^\(\d{3}\) ?\d{3}-\d{4}$/', $fax);
//Trả về 1
$phone_pattern = '^(\d{3}-)|(\(\d{3}\) ?)\d{3}-\d{4}$';
preg_match($phone_pattern, $phone);
//Trả về 1
preg_match($phone_pattern, $fax);
//Trả về 1
Các xác nhận trước:
Ví dụ:
Xác nhận trước
(Look-ahead assertion)
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
18
(?=[[:digit:]]
//Ký tự kế tiếp trong chuỗi mẫu phải là chữ số
(?=.*[[:digit:]])
//Chuỗi mẫu phải chứa ít nhất một chữ số
$pattern = '/^(?=.*[[:digit:]])[[:alnum:]]{6}$';
preg_match($pattern, 'Harris');
//Xác nhận thất bại và trả về 0
preg_match($pattern, 'Harri5');
//Trả về 1
Xác nhận trước đảo ngược
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
19
$pattern = '/^(?!3[2-9])[0-3][[:digit:]]$/';
preg_match($pattern, '32');
//Xác nhận thất bại và trả về 0
preg_match($pattern, '31');
//Trả về 1
Chuỗi mẫu:
Các thành phần:
Chuỗi mẫu kiểm tra
độ phức tạp của mật khẩu
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
20
$pw_pattern =
'/^(?=.*[[:digit:]])(?=.*[[:punct:]])[[:print:]]{6,}$/'
^ //Bắt đầu xâu
(?=.*[[:digit:]]) //Ít nhất một chữ số
(?=.*[[:punct:]]) //Ít nhất một dấu câu
[[:print:]]{6,} //Ít nhất sáu ký tự in được
$ //Kết thúc xâu
Sử dụng chuỗi mẫu:
Chuỗi mẫu kiểm tra
độ phức tạp của mật khẩu
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
21
$password1 = 'sup3rsecret';
$password2 = 'sup3rse(ret';
preg_match($pw_pattern, $password1);
//Trả về 0
preg_match($pw_pattern, $password2);
//Trả về 1
Biểu thức chính quy nhiều dòng
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
22
$string = "Ray Harris\nAuthor";
$pattern1 = '/Harris$/';
preg_match($pattern1, $string);
//Không so khớp Harris và trả về 0
$pattern2 = '/Harris$/m';
preg_match($pattern2, $string);
//So khớp Harris và trả về 1
Biểu thức chính quy toàn cục
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
23
$string = "MBT_6745 MBT-5712";
$pattern = '/MBT-[[:digit:]]{4}';
$count = preg_match_all($pattern, $string, $matches);
//Count có giá trị 2
foreach ($matches[0] as $match) {
echo '<div>' . $match . '</div>';
//Hiển thị MBT-6745 và MBT-5712
}
Sử dụng hàm preg_place để thay thế một chuỗi
mẫu với một xâu:
Hàm preg_replace
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
24
$items = 'MBT-6745 MBS-5729';
$items = preg_replace('/MB[ST]/', 'ITEM’, $items);
echo $items; // Hiển thị ITEM-6745 ITEM-5729
Sử dụng hàm preg_split để tách một chuỗi dựa
trên mẫu so khớp:
Hàm preg_split
Bài 3 - Một số kỹ thuật lập trình PHP nâng cao
25
$items = 'MBT-6745 HBS-5729, MBT-6824, and MBS-5214';
$pattern = '/[, ]+{and[ ]*)?/';
$items = preg_split($pattern, $items);
// $items chứa: 'MBT-6745', 'MBS-5729', 'MBT-6824',
'MBS-5214'
foreach ($items as $item) {
echo '<li>' . $item . '</li>';
}