Học về hàm preg_match trong php

Học về hàm preg_match trong php là vấn đề được nhiều lập trình viên quan tâm, bởi những kiến thức trên trường lớp là không đủ, vì vậy bài Học về hàm preg_match trong php sẽ chia sẻ tới bạn nhiều thông tin hữu ích

Mọi người vẫn hỏi tôi về việc học lập trình nói chung và PHP nói riêng có cần năng khiếu hay quá khó để tiếp cận hay không. Thì tôi có thể trả lời rằng, học lập trình cũng như việc bạn học tiếng Anh hay bất kỳ một ngôn ngữ khác, bởi lập trình...là ngôn ngữ của máy tính, để máy tính đọc và máy tính thực hiện theo yêu cầu của mình, bạn thích là học được.

Nếu bạn theo dõi serie học Regular Expression từ đầu cho tới giờ thì hàm preg_match() không còn xa lạ gì nữa, nhưng nếu bạn là khách viếng thăm và đây là bài đầu tiên của bạn thì mình khuyên bạn nên quay lại đọc từ bài Regular Expression là gì thì sẽ tốt hơn. Tuy nhiên mình vẫn giới thiệu từ đầu để phù hợp với mọi đối tượng luôn.

1. Hàm preg_match() trong PHP

Hàm preg_match() được dùng để kiểm tra, so khớp và lấy kết quả của việc so sánh chuỗi dựa vào biểu thức chính quy Regular Expression, hàm này có ba tham số và có cú pháp như sau:

  • preg_match ( $pattern , $subject, &$matches)

Trong đó:

  • $pattern là biểu thức Regular Expression
  • $subject là chuỗi cần kiểm tra
  • $matches là kết quả trả về, đây là một tham số truyền vào ở dạng tham chiếu.

Kết quả:

  • Kết quả của hàm preg_match() sẽ trả về TRUE nếu so khớp và FALSE nếu không khớp.

Ví dụ: kiểm tra một chuỗi có phải là một dãy số hay không.

$pattern = '/^[0-9]+$/';
$subject = '0979306603';
if (preg_match($pattern, $subject, $matches)){
    echo 'Đây là một dãy số';
} 

Nếu bạn thắc mắc tại sao biến $matches không tồn tại và mình truyền vào nhưng chương trình chạy không bị lỗi thì mình xin giải thích rằng đó là vì tham số thứ ba $matches là một tham chiếu nên bạn có thể truyền được như vậy, và bạn có thể đặt cho nó một cái tên bất kỳ chứ không nhất thiết phải là $matches.

Bây giờ mình sẽ thực hành một số ví dụ để bạn hiểu rõ hơn về hàm này nhé.

2. Các ví dụ hàm preg_match trong php

Mình xin nhắc lại kết quả của hàm preg_match() sẽ trả về TRUE/FALSE nên nếu bạn muốn lấy kết quả thì phải thông qua biến $matches.

Ví dụ 1: xem thử giá trị của biến $matches

$subject = "hoidapcode.com";
$pattern = '/com/';
preg_match($pattern, $subject, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>'; 

Kết quả:

Array
(
    [0] => com
) 

Như vậy kết quả trả về của biến $matches là một mảng các ký tự được so khớp.

Nếu bạn thắc mắc tại sao mảng trả về lại ở dạng [0] => net thì xem các ví dụ dưới đây nhé.

Ví dụ 2: Capturing Value - gom nhóm 1 cấp

$subject = "hoidapcode.com";
$pattern = '/(com)/';
preg_match($pattern, $subject, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>'; 

Kết quả:

  Array  (
      [0] => net
      [1] => net
  ) 

Ví dụ 3: Capturing Value - gom nhóm 2 cấp

$subject = "Hoidapcode.com";
  $pattern = '/((com))/';
  preg_match($pattern, $subject, $matches);
  echo '<pre>';  print_r($matches);
  echo '</pre>';    

Kết quả:

  Array  (
      [0] => com
     [1] => com
      [2] => com
  ) 

Nhận xét:

Cả 3 ví dụ trên đều cùng một mục đích là lấy ra chuỗi net , tuy nhiên cách khai báo lại khác nhau:

  • Ví dụ 1: $partern = '/com/'
  • Ví dụ 2: $partern = '/(com)/'
  • Ví dụ 3: $partern = '/((com))/'

Và kết quả cũng khác nhau:

  • Ví dụ 1: chuỗi $partern = '/com/' => index số 0 trong $matches là kết quả của toàn chuỗi pattern /com/.
  • Ví dụ 2: chuỗi $partern = '/(com)/' => index số 0 trong $matches là kết quả của toàn chuỗi pattern /(com)/, index số 1 trong $matches là kết quả của biểu thức trong cặp đóng mở (com)
  • Ví dụ 3: Chuỗi $partern = '/((com))/' => index số 0 trong $matches là kết quả của toàn chuỗi pattern /((com))/, index số 1 trong $matches là kết quả biểu thức trong cặp đầu tiên ((com)), index số 2 trong $matches là kết quả biểu thức trong cặp ngoặc cuối cùng (com)

Nếu bạn không hiểu khái niệm về Capturing Value thì quay lại các bài trước dể đọc nhé:

  • Quy tắc Regular Expression căn bản (p1)
  • Quy tắc Regular Expression căn bản (p2)

Kết luận:

Dựa vào nhận xét trên ta có được kết luận như sau: 

  • Kết quả của biến $matches là một mảng các Capturing Value được so khớp, nhưng bao nhiêu phần tử thì phụ thuộc vào biểu thức Regular Expression.
  • Biểu thức sẽ duyệt từ trái sang phải và toàn bộ Regex sẽ là nhóm thứ nhất (tức là phần tử 0), duyệt tiếp và mỗi lần gặp cặp biểu thức Regex (được gom nhóm bởi ()) thì sẽ coi như là phần tử tiếp theo.

3. Một vi dụ khác hàm preg_match

Ví dụ 1: Chúng ta sẽ làm một ví dụ lấy domain của https://Hoidapcode.com nằm trong một chuỗi cho trước.

$subject = "website hoc mien phi https://hoidapcode.com rat la hay";
$pattern = '/(http)(.+)(com)/';
preg_match($pattern, $subject, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';  

Kết quả sẽ trả về 4 phần tử tại vì trong pattern có 3 đoạn gom nhóm Regex, kết hợp với toàn bộ regex nữa nên kết quả sẽ là 4 phần tử.

Array
(
    [0] => https://hoidapcode.com
    [1] => http
    [2] => ://hoidapcode.
    [3] => net
) 

Ví dụ 2: Bonus cho các bạn thêm một ví dụ nữa đó là lấy chuỗi nằm trong cặp ngoặc vuông [].

// Lấy chuỗi nằm giữa 2 dấu [ và ]
$subject = "Chuỗi cần lấy là [chuỗi này] mọi người";
$pattern = '/\[(.+)\]/';
if (preg_match($pattern, $subject, $matches)){
    // kêt quả matches sẽ có 2 phần tử
    // phần tử thứ nhất là toàn regex =>  "[chuỗi này]"
    // chuỗi thứ 2 là kết quả đoạn regex bên trong dấu () => "chuỗi này"
    echo "kết quả toàn chuỗi là: <br/>";
    echo '<pre>';
    print_r($matches);
    echo '</pre>';
     
    echo "Kết quả muốn lấy là: <br/>";
    echo $matches[1];
} 

4. Lời kết

Bài này mình thấy khá là hay bởi vì kết hợp RegEx với hàm preg_match() trong PHP bạn có thể lấy được bất kì một chuỗi con nào miễn là có một quy tắc để lấy, hàm này không những dùng để lấy chuỗi con dựa vào việc so khớp mà nó còn có tác dụng kiểm tra kết quả so khớp và trả về TRUE/FALSE.

Ngoài ra chúng ta hay sử dụng hàm preg_match() để validate dữ liệu như kiểm tra định dạng Email, Phone, .. và một chức năng khá hay khác là bóc tách dữ liệu từ website khác.

Hy vọng với bài viết về Học về hàm preg_match trong php đã giải đáp giúp bạn phần nào về kiến thức lập trình PHP. Như tôi đã nói, ngôn ngữ lập trình không quan trọng bằng tư duy giải thuật, tư duy logic để giải quyết vấn đề.

Với những năm trước đây, lập trình viên là một cái nghề khó và kén chọn người học, đồng nghĩa với việc thu nhập hàng tháng của các lập trình viên luôn cao. Còn những năm gần đây, thì lập trình là môn học phổ thông, và ai cũng nên học một ngôn ngữ lập trình nào đó.

Nếu bạn còn bất kỳ câu hỏi nào trong việc học lập trình online, hãy gửi yêu cầu cho tôi qua email hoidapcode.com@gmail.com hoặc để lại comment bên dưới, tôi sẽ giải đáp trong vòng 24 giờ!

Blog hoidapcode.com là blog được tổng hợp tự động các bài học, thông tin về lập trình trên mạng internet. Nếu bạn có ý kiến hoặc đóng góp về bài viết này, hãy liên hệ với tôi!