Hướng dẫn preg_match in php - preg_match trong php

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.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.

Hướng dẫn preg_match in php - preg_match trong php

Hướng dẫn preg_match in php - preg_match trong php

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.freetuts.net, không được copy dưới mọi hình thức.

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:

  • $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    1

Trong đó::

  • $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    2 là biểu thức Regular ExpressionRegular Expression
  • $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    3 là chuỗi cần kiểm tra
  • $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4 là kết quả trả về, đây là một tham số truyền vào ở dạng tham chiếu.

Kết quả::

Bài viết này được đăng tại [free tuts .net]

  • Kết quả của hàm preg_match() sẽ trả về
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    6 nếu so khớp và
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    7 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.: 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

$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4 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
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4 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à
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4.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
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4 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à
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4.

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ề

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
2 nên nếu bạn muốn lấy kết quả thì phải thông qua biến
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4.

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

$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4: xem thử giá trị của biến
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4

$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';

Kết quả:

Bài viết này được đăng tại [free tuts .net]

Kết quả của hàm preg_match() sẽ trả về

$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
6 nếu so khớp và
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
7 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.: Capturing Value - gom nhóm 1 cấp

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';

Kết quả:

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

Bài viết này được đăng tại [free tuts .net]: Capturing Value - gom nhóm 2 cấp

$subject = "freetuts.net";
$pattern = '/((net))/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';

Kết quả:

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

Bài viết này được đăng tại [free tuts .net]

Kết quả của hàm preg_match() sẽ trả về

$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
6 nếu so khớp và
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
7 nếu không khớp.net, tuy nhiên cách khai báo lại khác nhau:

  • Ví dụ: kiểm tra một chuỗi có phải là một dãy số hay không.
  • Nếu bạn thắc mắc tại sao biến
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4 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
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4 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à
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4.
  • 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ề
    $subject = "freetuts.net";
    $pattern = '/(net)/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    2 nên nếu bạn muốn lấy kết quả thì phải thông qua biến
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4.
  • Ví dụ 1: xem thử giá trị của biến
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4
  • Như vậy kết quả trả về của biến
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    4 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

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
6 thì xem các ví dụ dưới đây nhé.Capturing Value thì quay lại các bài trước dể đọc nhé:

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

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:
    $subject = "freetuts.net";
    $pattern = '/(net)/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    7
  • Ví dụ 2:
    $subject = "freetuts.net";
    $pattern = '/(net)/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    8 (được gom nhóm bởi
    $subject = "freetuts.net";
    $pattern = '/((net))/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    6) thì sẽ coi như là phần tử tiếp theo.

Ví dụ 3: $subject = "freetuts.net"; $pattern = '/(net)/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';9

Và kết quả cũng khác nhau: Chúng ta sẽ làm một ví dụ lấy domain của https://freetuts.net nằm trong một chuỗi cho trước.

$subject = "website hoc mien phi https://freetuts.net rat la hay";
$pattern = '/(http)(.+)(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';

Ví dụ 1: chuỗi

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
7 => index số 0 trong
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4 là kết quả của toàn chuỗi pattern
Array
(
    [0] => net
    [1] => net
)
2.

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

Ví dụ 2: chuỗi

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
8 => index số 0 trong
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4 là kết quả của toàn chuỗi pattern
Array
(
    [0] => net
    [1] => net
)
5, index số 1 trong
$subject = "freetuts.net";
$pattern = '/net/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
4 là kết quả của biểu thức trong cặp đóng mở (
Array
(
    [0] => net
    [1] => net
)
7)
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
$subject = "freetuts.net";
$pattern = '/((net))/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
7.

// 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à: 
"; echo '
';
    print_r($matches);
    echo '
'; echo "Kết quả muốn lấy là:
"; echo $matches[1]; }

Ví dụ 3: Chuỗi $subject = "freetuts.net"; $pattern = '/(net)/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';9 => index số 0 trong $subject = "freetuts.net"; $pattern = '/net/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';4 là kết quả của toàn chuỗi pattern $subject = "freetuts.net"; $pattern = '/((net))/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
'; 0, index số 1 trong $subject = "freetuts.net"; $pattern = '/net/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';4 là kết quả biểu thức trong cặp đầu tiên ($subject = "freetuts.net"; $pattern = '/((net))/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
'; 2), index số 2 trong $subject = "freetuts.net"; $pattern = '/net/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';4 là kết quả biểu thức trong cặp ngoặc cuối cùng (Array ( [0] => net [1] => net )7)

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é: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ề

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
2.

Quy tắc Regular Expression căn bản (p1)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.