8/12/15

Bài 07: Hàm preg_match_all trong php

Hàm preg_match_all cũng có chức năng giống như preg_match đó là so khớp và trả về kết quả. Tuy nhiên vẫn có sự khác biệt đó là:
Preg_match: Chỉ chỉ trả về một kết quả cho mỗi regex con. Ví dụ lấy đoạn chuỗi bên trong cặp nháy kép của chuỗixin chào "các bạn", chào mừng đến "freetuts.net" thì code như sau:
1
2
3
4
5
$subject 'Hello "Everybody", welcome to "freetuts.net"';
preg_match('/"(.+)"/'$subject$matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
Kết quả sẽ là:
Array
(
    [0] => "Everybody", welcome to "freetuts.net"
    [1] => Everybody", welcome to "freetuts.net
)
Mục đích của ta chỉ lấy đoạn text bên trong cặp nháy kép, nhưng nó trả về dài quá :D. Lý do là nó duyệt từ dấu nháy đầu chuỗi cho đến cuối chuỗi nên kết quả mới như vậy.
Để lấy đoạn text trong cặp dấu nháy thứ nhất thì ta phải thêm dấu ? đằng sâu dấu + của chuỗi partern trên, có ý nghĩa là lấy kết quả match đầu tiên.
1
2
3
4
5
$subject 'Hello "Everybody", welcome to "freetuts.net"';
preg_match('/"(.+?)"/'$subject$matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
Kết quả sẽ là:
Array
(
    [0] => "Everybody"
    [1] => Everybody
)
Như vậy các bạn thấy preg_match chỉ lấy được một kết quả duy nhất. Có cách nào lấy hết kết quả không? Để trả lời ta xem qua hàm preg_match_all nhé.
preg_match_all: sẽ trả về hết kết quả so khớp chứ không phải là kết quả đầu tiên như preg_match.
  • Cú pháppreg_match_all ($pattern, $subject, &$matches)
  • Trong đó:
    • $partern là biểu thức Regular Expression
    • $subject là chuỗi muốn kiểm tra
    • &$matches là biến lưu kết quả sau khi match

Ví dụ preg_match_all trong php

Ví dụ 1: Như ví dụ trên, tức là lấy đoạn chuỗi bên trong cặp nháy kép của chuỗixin chào "các bạn", chào mừng đến "freetuts.net"
1
2
3
4
5
$subject 'Hello "Everybody", welcome to "freetuts.net"';
preg_match_all('/"(.+?)"/'$subject$matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
Kết quả là :
Array
(
    [0] => Array
        (
            [0] => "Everybody"
            [1] => "freetuts.net"
        )

    [1] => Array
        (
            [0] => Everybody
            [1] => freetuts.net
        )

)
Kết quả nó trả về một mảng 2 phần tử cha. Nếu để ý kỹ thì các bạn sẽ thấy mỗi phần tử trả về là kết quả giống như hàm preg_match. Nên mình không giải thích thêm về phần này nhé.
Giờ bạn thay đổi chuỗi $subject = 'Hello "Everybody", welcome to "freetuts.net", thanks for "like it"'. Bạn chạy và kết quả sẽ là:
Array
(
    [0] => Array
        (
            [0] => "Everybody"
            [1] => "freetuts.net"
            [2] => "like it"
        )

    [1] => Array
        (
            [0] => Everybody
            [1] => freetuts.net
            [2] => like it
        )

)
Rất đơn giản đúng không nào. Giờ lấy kết quả thì có 2 lựa chọn:
  • Nếu lấy có dấu ngoặc thì chọn phần tử thứ nhất
  • Nếu lấy không có dấu ngoặc thì chọn phần tử thứ 2
Giải thích tại sao lại có 2 phần tử thì như bài trước, phần tử thứ nhất là chuỗi toàn partern, phần tử thứ 2 là kết quả của đoạn regex(.+?)
Ví dụ 2: Lấy tất cả nội dung bên trong tất cả thẻ div  của một file html.
Để lấy tất cả các đoạn text trong tất cả thẻ div thì ta phải dùng đến hàm preg_match_all trong php rồi, đoạn $partern sẽ có dạng$partern = '/<div>(.*?)<\/div>/'. Lưu ý phải có dấu ? nha bạn, vì có dấu ? thì máy sẽ hiểu là lấy từng kết quả chứ không phải duyệt hết chuỗi rồi lấy (gọi là Greedy, bạn quay lại bài trước để xem phần này nhé).
1
2
3
4
5
$subject '<div>Div1</div><div>Div2</div><div>Div3</div>';
preg_match_all('/<div>(.*?)<\/div>/'$subject$matches);
echo '<pre>';
var_dump($matches);
echo '</pre>';
Kết quả sẽ là:

Lời Kết

Có lẽ mình cũng không biết nói gì thêm nữa, các bạn cố gắng nắm vững các quy tắc regular expression  và tự mình thực hành nhiều ví dụ hơn thì sẽ hiểu ra. Chúc các bạn học vui vẻ với serie học Regular Expression PHP này.

Nguồn: (code.freetuts.net)
Bạn đang đọc bài viết Bài 07: Hàm preg_match_all trong php tại Website: Học Lập Trình

0 nhận xét: