Negative Và Positive Lookbehind trong Regular Expression

Lookbehind dùng để xác định sự chọn lựa ở phía trước của một chuỗi Regular Expression, gồm có 2 loại là Negative LookbehindPositive Lookbehind. Đây là một quy tắc rất hay sử dụng để xử lý chuỗi nên nếu bạn bỏ qua phần này là một sai lầm đấy.

test php

banquyen png

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

Để dễ hình dung tôi đưa ra một ví dụ nhé:

Ví dụ 1: Hãy lấy tất cả những phần đuôi email của thehalfheart trong chuỗi [email protected], [email protected], [email protected]. Kết quả muốn lấy sẽ là @gmail.com@yahoo.com

Nếu dùng các quy tắc Regular Expression căn bản thì ta sẽ làm như sau:

Bài viết này được đăng tại [phpbbvietnam.com]


$string = '[email protected], [email protected], [email protected]';
preg_match_all('/@[^,]+/', $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Kết quả:


Array
(
    [0] => Array
        (
            [0] => @gmail.com
            [1] => @facebook.com
            [2] => @yahoo.com
        )
)

Đây không phải là kết quả mong đợi của ta vì dư @facebook.com. Giờ nếu ta đưa luôn chuỗi thehalfheart vào chuỗi Regular Expression như thế nào? Ta cùng xem code nhé:


$string = '[email protected], [email protected], [email protected]';
preg_match_all('/thehalfheart@[^,]+/', $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Kết quả:


Array
(
    [0] => Array
        (
            [0] => [email protected]
            [1] => [email protected]
        )
)

Kết quả đúng là trả về 2 email của thehalfheart nhưng lại dư chữ thehalfheart nên không đúng như yêu cầu đề bài.

Vậy giải pháp của ta là sử dụng Positive Lookbehind trong Regular Expression để đưa vào chuỗi RegEx, nhưng trước tiên ta xem cú pháp nó đã:

Read More:   Hàm strripos trong php

Positive Lookbehind

Cú pháp: (?<=)

Ý tưởng:

Ở bài toán Ví dụ 1 ta thấy thông tin cần lấy là phần đuôi của email có phần đầu là thehalfheart. Như vậy ta sẽ dùng Positive Lookbehind để chọn lựa, nếu nói tiếng việt thì thế này: Lấy phần đuôi của email có phần đầu bằng thehalfheart. Các bạn xem bài giải nhé:


$string = '[email protected], [email protected], [email protected]';
preg_match_all('/(?<=thehalfheart)@[^,]+/', $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Kết quả:


Array
(
    [0] => Array
        (
            [0] => @gmail.com
            [1] => @yahoo.com
        )
)

Thật tuyệt vời, kết quả như mong đợi =))

Giải thích:

Ở chuỗi partern trong đoạn code trên ta tôi đã đưa vào một đoạn Positive Lookbehind (?<=thehalfheart) nên hệ thống sẽ hiểu là bắt đầu bằng thehalfheart và vì chữ thehalfheart nằm trong phần Lookbehind nên nó không nằm trong kết quả trả về.

negative Lookbehind

Cú pháp: (?<!)

Ngược với Positive, Negative sẽ lựa chọn với điều kiện là không giống. Giờ ta sẽ làm một ví dụ cho nó xôn nha.

Ví dụ 2: Lấy phần đuôi của email không phải là thehalfheart trong chuỗi sau: [email protected], [email protected], [email protected], [email protected]. Có nghĩa kết quả trả về là @facebook.com@phpbbvietnam.com.

Bài giải:


$string = '[email protected], [email protected], [email protected], [email protected]';
preg_match_all('/(?<!thehalfheart)@[^,]+/', $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Kết quả:


Array
(
    [0] => Array
        (
            [0] => @facebook.com
            [1] => @phpbbvietnam.com
        )

)

Ôi trời, kêt quả đúng rồi, sao hay thế nhỉ?

Giải thích:

Tương tự như giải thích phần Positive, chuỗi partern có một đoạn Negative Lookahead (?<!thehalfheart) nên hệ thống sẽ hiểu là lấy những email nào có phần đầu không phải là thehalfheart, và chữ thehalfheart nằm trong lookahead nên nó sẽ không có trong kết quả trả về.

Read More:   Hàm mktime trong php

Lời Kết

Qua 2 ví dụ trên căn bản các bạn cũng hình dung được phần nào rồi nhỉ, các bạn hãy làm theo ví dụ, tự ra đề và tự giải để thưởng thức thành quả của bài học Positive và Positive Lookahead Trong Regular Expressoin nhé.

Danh sách file tải về

Bài viết này, The Learn PHP Tutorial Đã gửi đến bạn đọc kiến thức về “Negative Và Positive Lookbehind trong Regular Expression❤️️”. Admin hy vọng qua phần nội dung trong bài”Negative Và Positive Lookbehind trong Regular Expression” có thể giúp bạn đọc có thêm kiến thức về “Negative Và Positive Lookbehind trong Regular Expression trong quá trình tự học PHP của mình .

Bài viết “Negative Và Positive Lookbehind trong Regular Expression” posted by on 2022-07-15 02:54:32. Cảm ơn bạn đọc đã xem bài viết tại Phpbbvietnam.com Và đừng quên chia sẻ bài viết này để nhiều người khác cũng có thể xem tài liệu học php miễn phí này nhé.

Back to top button