39
Bài 3 Một số kỹ thuật lập trình PHP nâng cao

Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Embed Size (px)

DESCRIPTION

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ệ

Citation preview

Page 1: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Bài 3Một số kỹ thuật lập trình PHP nâng cao

Page 2: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Cách tạo một biểu thức chính quy và xử lý bằnghàm preg_matchCách sử dụng biểu thức chính quy nhiều dòng,toàn cụcCách sử dụng hàm preg_replace và preg_splitđể làm việc với biểu thức chính quyCơ chế sử dụng biểu thức chính quy trong xácthực dữ liệuCơ 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

Page 3: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Tạo và sử dụng biểu thức chính quySo 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òngSử dụng biểu thức chính quy toàn cụcThay 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

Page 4: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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);

Page 5: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Kiểm tra lỗitrong 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';

}

Page 6: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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 quykhô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);

Page 7: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Khái niệm biểu thức chính quy (regularexpression)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

Page 8: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 9: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 10: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 11: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 12: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Sử dụngcá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

Page 13: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 14: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 15: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 16: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 17: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 18: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 19: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 20: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 21: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 22: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

Page 23: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

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

}

Page 24: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Sử dụng hàm preg_place để thay thế một chuỗimẫ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

Page 25: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Sử dụng hàm preg_split để tách một chuỗi dựatrê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>';}

Page 26: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Các biểu thức chính quydùng để kiểm tra tính hợp lệ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 26

//Số điện thoại với định dạng: 999-999-9999/^[[:digit:]]{3}-[[:digit:]]{3}-[[:digit:]]{4}$/

//Số thẻ ghi nợ với định dạng: 9999-9999-9999-9999/^[[sdigit:]]{4}{-[[sdigit:]]{4}){3}$/

//Mã vùng với một trong hai định dạng sau: 99999 hoặc99999-9999/^[[sdigit s]]{5}(-[[sdigit s ]]{4})?$/

//Ngày với định dạng: mm/dd/yyyy/^(0?[1-9]|l[0-2])\/(0?[l-9]|[12][[sdigit:]]|3[01])\/[[:digit:]]{4}$/

Page 27: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Xác thực số điện thoại

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 27

$phone = '559-555-6624'; //Số điệnthoại hợp lệ$phone_pattern = '/^[[:digit:]]{3}-[[:digit:]]{3}-[[:digit:]]{4}$/';$match = preg_match($phone_pattern, $phone); //Trả về 1

Page 28: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Xác thực ngày vớimột thành phần không hợp lệ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 28

$date = '8/10/209'; //Ngày không hợp lệ$date_pattern = '/^(0?[1-9]|1[0-2])\/'

. '(0?[1-9]|[12][[:digit:]]|3[01])\/'

.'[[:digit:]]{4}$/';$match = preg match($date pattern, $date); // Trả về 0

Page 29: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Xác thực địa chỉ email đầy đủ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 29

function valid_email ($email) {$parts = explode(“@”, $email);if (count($parts) != 2 ) return false;if (strlen($parts[0]) > 64) return false;if (strlen($parts[1]) > 255) return false;

$atom = '[[:alnum:]_!#$%&\'*+\/=?^`{|}~-]+';$dotatom = '(\.' . $atom . ')*';$address = '(^' . $atom . $dotatam . '$)';$char = '([^\\\\"])';$esc = '(\\\\[\\\\"])';$text = '(' . $char . '|' . $esc . ')+';$quoted = '(^"' . $text . '"$)';$local_part = '/' . $address . '|' . $quoted . '/';$local_match = preg_match($local_part, $parts[0]);if ($local_match === false || $local_match != 1) returnfalse;

Page 30: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Xác thực địa chỉ email đầy đủ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 30

$hostname = '([[:alnum:]]([-[:alnum:]]{0,62}[[:alnum:]])?)';$hostnames = '(' . $hostname . '(\-' . $hostname . ')*)';$top = '\.[[:alnum:]]{2,6}';$domain_part = '/^' . $hostnames . $top . '$/';$domain_match = preg_match($domain_part, $parts[1]);if ($domain_match === false || $domain_match != 1) returnfalse;

return true;

Page 31: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Tạo và ném ngoại lệSử dụng biểu thức try-catch

Xử lý ngoại lệ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 31

Page 32: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Cú pháp câu lệnh tạo ngoại lệ mới:

Cú pháp câu lệnh ném ngoại lệ:

Ngoại lệ (Exception)

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 32

new Exception($message [, $code])

throw $exception

Page 33: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Hàm có thể ném ra một ngoại lệ:

Ngoại lệ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 33

function calculate_future_value($investment,$interest_rate, $years){

if ($investment <= 0 || $interest_rate <= 0 ||$years <= 0 ) {

throw new Exception("Please check your entriesfor validity."); // Dữ liệu nhập vào không hợp lệ

}$futurevalue = $investment;for ($i = 1; $i <= $years; $i++) {

$future_value =($future_value + ($future_value* $interest_rate * .01));

}return round($futureValue, 2);

}

Page 34: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Câu lệnh sẽ kích hoạt việc ném ngoại lệ:

Ngoại lệ

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 34

$futureValue = calculate_future_value(10000, 0.06, 0);// Ném ngoại lệ

Page 35: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Phương thức Giải thích

getMessage() Trả về thông báo được truyền vào cho Exception

getCode() Trả về mã lỗi được truyền vào cho Exception

getFile() Trả về file mà trong đó Exception đã được ném ra

getLine() Trả về dòng mã nơi Exception được ném ra

getTrace() Trả về mảng chứa ngăn xếp dò dấu cho đối tượng Exception

getTraceAsString() Trả về chuỗi chứa ngăn xếp dò dấu cho đối tượng Exception

Phương thứccủa đối tượng Exception

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 35

Page 36: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Cú pháp:

Câu lệnh try - catch bắt một đối tượng ngoại lệ:

Biểu thức try-catch

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 36

try { statements }catch (ExceptionClass $exceptionName) { statements }[ catch (ExceptionClass $exceptionName) { statements } ]

try {$fv = calculate_future_value(10000, 0.06, 0);

//Ném lỗiecho 'Future value was calculated successfully.';

} catch (Exception $e) {echo 'Error: ' . $e->getMessage();

}

Page 37: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Câu lệnh try-catch ném lại một đối tượng ngoạilệ:

Biểu thức try-catch

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 37

try {$fv = calculate_future_value($investment,

$annual_rate, $years);} catch (Exception $e) {

// làm gì đó trước khi ném ngoại lệthrow $e;

}

Page 38: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Câu lệnh try - catch bắt hai kiểu ngoại lệ:

Biểu thức try-catch

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 38

try {$db = new PDO($dsn, 'mmuser', 'pa55word', $options);//câu lệnh khác

} catch (PDOException $e) {echo 'PDOException: ' . $e->getMessage();

} catch (Exception $e) {echo 'Exception: ' . $e->getMessage();

}

Page 39: Bài 3 Một số kỹ thuật lập trình PHP nâng cao - Xây dựng ứng dụng web

Biểu thức chính quy định nghĩa một chuỗi mẫuđược dùng để tìm kiếm trong một chuỗiXác nhận trước là kiểu xác nhận đặc biệt yêucầu chuỗi mẫu con cần được so khớp để cảchuỗi mẫu được so khớpSử dụng câu lệnh throw để ném một đối tượngException (ngoại lệ)Sử dụng câu lệnh try-catch để bắt bất kỳ ngoạilệ nào được ném ra

Tổng kết bài học

Bài 3 - Một số kỹ thuật lập trình PHP nâng cao 39