Hướng dẫn php preg_match multiple patterns - php preg_match nhiều mẫu

Just in case some day you will need a non-regex solution, you can use the following startswith and endswith functions:

function startsWith($haystack, $needle) {
        // search backwards starting from haystack length characters from the end
        return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
    }
function endsWith($haystack, $needle) {
        // search forward starting from end minus needle length characters
        return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== FALSE);
    }

if (startsWith("1,2", "1,") || endsWith("1,2", ",3"))
 echo "True1". "\n";
if (startsWith("31,2", "1,") || endsWith("31,2",",3"))
 echo "True2". "\n";
if (startsWith("4,3", "1,") || endsWith("4,3",",3"))
 echo "True3" . "\n";

Output of the IDEONE demo:

True1
True3

Nếu bạn theo dõi serie học Regular Expression từ đầu cho tới giờ thì hàm

True1
True3
1 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.

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

True1
True3
1 đượ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:

  • True1
    True3
    
    3

Trong đó::

  • True1
    True3
    
    4 là biểu thức Regular ExpressionRegular Expression
  • True1
    True3
    
    5 là chuỗi cần kiểm tra
  • True1
    True3
    
    6 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
    True1
    True3
    
    1 sẽ trả về
    True1
    True3
    
    8 nếu so khớp và
    True1
    True3
    
    9 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

True1
True3
6 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
True1
True3
6 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à
True1
True3
6.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
True1
True3
6 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à
True1
True3
6.

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

True1
True3
1 sẽ trả về
$pattern = '/^[0-9]+$/';
$subject = '0979306603';
if (preg_match($pattern, $subject, $matches)){
    echo 'Đây là một dãy số';
}
4 nên nếu bạn muốn lấy kết quả thì phải thông qua biến
True1
True3
6.

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

True1
True3
6: xem thử giá trị của biến
True1
True3
6

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

Kết quả:

Như vậy kết quả trả về của biến

True1
True3
6 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

$pattern = '/^[0-9]+$/';
$subject = '0979306603';
if (preg_match($pattern, $subject, $matches)){
    echo 'Đây là một dãy số';
}
8 thì xem các ví dụ dưới đây nhé.

Ví dụ 2: Capturing Value - gom nhóm 1 cấp: 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
)

Như vậy kết quả trả về của biến

True1
True3
6 là một mảng các ký tự được so khớp.: 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
)

Như vậy kết quả trả về của biến True1 True3 6 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

$pattern = '/^[0-9]+$/';
$subject = '0979306603';
if (preg_match($pattern, $subject, $matches)){
    echo 'Đây là một dãy số';
}
8 thì xem các ví dụ dưới đây nhé.net, tuy nhiên cách khai báo lại khác nhau:

  • 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:
    $pattern = '/^[0-9]+$/';
    $subject = '0979306603';
    if (preg_match($pattern, $subject, $matches)){
        echo 'Đây là một dãy số';
    }
    9
  • Ví dụ 2:
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    0
  • Ví dụ 3:
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    1

Và kết quả cũng khác nhau:Capturing Value thì quay lại các bài trước dể đọc nhé:

  • Ví dụ 1: chuỗi
    $pattern = '/^[0-9]+$/';
    $subject = '0979306603';
    if (preg_match($pattern, $subject, $matches)){
        echo 'Đây là một dãy số';
    }
    9 => index số 0 trong
    True1
    True3
    
    6 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 '
    ';
    4.
  • Ví dụ 2: chuỗi
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    0 => index số 0 trong
    True1
    True3
    
    6 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 '
    ';
    7, index số 1 trong
    True1
    True3
    
    6 là kết quả của biểu thức trong cặp đóng mở (
    $subject = "freetuts.net";
    $pattern = '/net/';
    preg_match($pattern, $subject, $matches);
    echo '
    ';
    print_r($matches);
    echo '
    ';
    9)

Ví dụ 3: Chuỗi $subject = "freetuts.net"; $pattern = '/net/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';1 => index số 0 trong True1 True3 6 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 '
';2, index số 1 trong True1 True3 6 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 '
';4), index số 2 trong True1 True3 6 là kết quả biểu thức trong cặp ngoặc cuối cùng ($subject = "freetuts.net"; $pattern = '/net/'; preg_match($pattern, $subject, $matches); echo '
';
print_r($matches);
echo '
';9)

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

Kết luận:

Dựa vào nhận xét trên ta có được kết luận như sau: 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 '
';

Kết quả của biến

True1
True3
6 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.

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

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

$subject = "freetuts.net";
$pattern = '/(net)/';
preg_match($pattern, $subject, $matches);
echo '
';
print_r($matches);
echo '
';
8) thì sẽ coi như là phần tử tiếp theo. 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 '
';
9.

True1
True3
0

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://freetuts.net nằm trong một chuỗi cho trước.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ề

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

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