Ngu ngơ học làm web (72) - Hàm preg_match trong PHP

Tiếp theo của: Ngu ngơ học làm web (71) - Biểu thức chính quy - regular expression
------

Phần 72.       Hàm preg_match trong PHP

Đây là clip số 66:


Hàm preg_match và preg_match_all của PHP sử dụng biểu thức chính quy để so khớp và lấy dữ liệu.
Cú pháp hàm preg_match:

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

Hàm preg_match thực hiện so khớp biểu thức chính quy $pattern trên chuỗi $subject. Nếu khớp, trả về giá trị 1; nếu không khớp, trả về giá trị 0; nếu có lỗi trả về giá trị FALSE, giá trị tìm thấy chứa trong mảng $matches.

Ví dụ 1,

$subject = 'Đây là chuỗi ví dụ';
$pattern = '/ví dụ/';
echo preg_match($pattern, $subject);

Ví dụ 2,

$subject = 'Đây là chuỗi ví dụ';
$pattern = '/ví dụ/';
echo preg_match($pattern, $subject, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Hàm preg_match_all trả về kiểu int (số các giá trị tìm thấy), các chuỗi tìm thấy được lưu trong mảng $matches. Ví dụ,

$subject = 'Đây là chuỗi ví dụ để làm ví dụ';
$pattern = '/ví dụ/';
echo preg_match_all($pattern, $subject, $matches);
echo '<pre>';
print_r($matches[0]);
echo '</pre>';

Cặp dấu ## được sử dụng để bao $pattern khi nó có chứa các kí tự đặc biệt. Ví dụ,

$subject = 'Đây là chuỗi /ví dụ/ để làm ví dụ';
  $pattern = '#/ví dụ/#';
  echo preg_match_all($pattern, $subject, $matches);
  echo '<pre>';
  print_r($matches[0]);
  echo '</pre>';

Ví dụ: hàm kiểm tra một email có hợp lệ hay không?

  function checkEmail($value) {
    $pattern = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i';
    $flag = false;
    if (preg_match($pattern, $value) == true) {
      $flag = true;
    }
    return $flag;
  }
  echo checkEmail('nguyenvan.teo@gmail.com');

Biểu thức chính quy, kiểm tra username có hợp lệ hay không (lấy từ stackoverflow):

/^[a-z\d_]{2,20}$/i
||||  | |||     |||
||||  | |||     ||i : case insensitive
||||  | |||     |/ : end of regex
||||  | |||     $ : end of text
||||  | ||{2,20} : repeated 2 to 20 times
||||  | |] : end character group
||||  | _ : underscore
||||  \d : any digit
|||a-z: 'a' through 'z'
||[ : start character group
|^ : beginning of text
/ : regex start

Viết các hàm kiểm tra username, password và website cũng tương tự như email, chỉ thay đổi giá trị của $pattern.

Đây là clip số 67:


Kiểm tra dữ liệu cho các input của form, nếu dữ liệu bị lỗi thì hiển thị thông báo ngay bên dưới input.

Lưu lại đoạn mã để tham khảo.

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: Helvetica, Arial, sans-serif; font-weight: 100; font-size: 12px; line-height: 30px; color: #777; background: #4CAF50; }
.container { max-width: 400px; margin: 0 auto;}
#contact { margin: 150px 0; padding: 25px; background: #F9F9F9; box-shadow: 0 0 25px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24); }
#contact input[type="text"],
#contact input[type="password"] { font: 400 12px/16px Helvetica, Arial, sans-serif; }
#contact h3 { display: block; font-size: 30px; font-weight: 300; margin-bottom: 10px; }
#contact h4 { display: block; font-size: 13px; font-weight: 400; margin: 5px 0 15px; }
fieldset { border: none; margin: 0 0 10px; min-width: 100%; padding: 0; width: 100%;}
#contact input[type="text"],
#contact input[type="password"] { width: 100%; border: 1px solid #ccc; background: #fff; margin: 0 0 5px; padding: 10px;}
#contact input[type="text"]:hover,
#contact input[type="password"]:hover { -webkit-transition: border-color 0.3s ease-in-out; -moz-transition: border-color 0.3s ease-in-out; transition: border-color 0.3s ease-in-out; border: 1px solid #aaa; }
#contact input[type="submit"] { cursor: pointer; width: 100%; border: none; background: #4CAF50; color: #fff; margin: 0 0 5px; padding: 10px; font-size: 15px;}
#contact input[type="submit"]:hover { background: #43A047; -webkit-transition: background 0.3s ease-in-out; -moz-transition: background 0.3s ease-in-out; transition: background-color 0.3s ease-in-out; }
.error { color: red; font-style: italic; }
</style>
<body>
  <?php
  $email = '';
  $username = '';
  $password = '';
  $website = '';
  $errors = array();
  if(!empty($_POST)) {
    $email = $_POST['email'];
    if (checkInput($email, 'email') == false) {
      $errors['email'] = '<p class="error">Địa chỉ email chưa hợp lệ</p>';
    }
    $username = $_POST['username'];
    if (checkInput($username, 'username') == false) {
      $errors['username'] = '<p class="error">Username chưa hợp lệ</p>';
    }
    $password = $_POST['password'];
    if (checkInput($password, 'password') == false) {
      $errors['password'] = '<p class="error">Password chưa hợp lệ</p>';
    }
    $website = $_POST['website'];
    if (checkInput($website, 'website') == false) {
      $errors['website'] = '<p class="error">Địa chỉ website chưa hợp lệ</p>';
    }
  }
  // Hàm kiểm tra cho bốn kiểu dữ liệu nhập vào:
  function checkInput($value, $type='email') {
    switch($type) {
      case 'email':
      $pattern = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i';
      break;
      case 'password':
      $pattern = '/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,12}$/';
      break;
      case 'username':
      $pattern = '/^[a-z\d_]{2,20}$/i';
      break;
      case 'website':
      $pattern = '/^(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)$/';
      break;
    }
    $flag = preg_match($pattern, $value);
    return $flag;
  }
  ?>
  <div class="container">
    <form id="contact" action="#" method="post">
      <h3>Liên hệ</h3>
      <h4>Thông tin để liên hệ với chúng tôi</h4>
      <fieldset>
        <input type="text" name="email" placeholder="Nhập địa chỉ email..." value="<?php echo $email; ?>">
        <?php if (isset($errors['email'])) { echo $errors['email']; } ?>
      </fieldset>
      <fieldset>
        <input type="text" name="username" placeholder="Nhập username..." value="<?php echo $username; ?>">
        <?php if (isset($errors['username'])) { echo $errors['username']; } ?>
      </fieldset>
      <fieldset>
        <input type="password" name="password" placeholder="Nhập mật khẩu..." value="<?php echo $password; ?>">
        <?php if (isset($errors['password'])) { echo $errors['password']; } ?>
      </fieldset>
      <fieldset>
        <input type="text" name="website" placeholder="Nhập website..." value="<?php echo $website; ?>">
        <?php if (isset($errors['website'])) { echo $errors['website']; } ?>
      </fieldset>
      <input type="submit" value="Gửi">
    </form>
  </div>
</body>
</html>

Đây là clip số 68:

Tối ưu đoạn mã “Kiểm tra dữ liệu cho một form”


-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web