REGULAR EXPRESSION PHP
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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 freetuts.net, 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 thehalfheart@gmail.com, freetuts@facebook.com, thehalfheart@yahoo.com. 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 [free tuts .net]

$string = 'thehalfheart@gmail.com, freetuts@facebook.com, thehalfheart@yahoo.com';
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 = 'thehalfheart@gmail.com, freetuts@facebook.com, thehalfheart@yahoo.com';
preg_match_all('/thehalfheart@[^,]+/', $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Kết quả:

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

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ó đã:

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 = 'thehalfheart@gmail.com, freetuts@facebook.com, thehalfheart@yahoo.com';
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: thehalfheart@gmail.com, freetuts@facebook.com, thehalfheart@yahoo.com, room@freetuts.net. Có nghĩa kết quả trả về là @facebook.com@freetuts.net.

Bài giải:

$string = 'thehalfheart@gmail.com, freetuts@facebook.com, thehalfheart@yahoo.com, room@freetuts.net';
preg_match_all('/(?<!thehalfheart)@[^,]+/', $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Kết quả:

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

)

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

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ề

Tên file tải về Pass giải nén
Tải bài học định dạng PDF freetuts.net hoặc gameportable.net

Cùng chuyên mục:

Hàm key_exists() trong PHP

Hàm key_exists() trong PHP

Cách sử dụng key_exists() trong PHP

Hàm mysqli_fetch_row() trong PHP

Hàm mysqli_fetch_row() trong PHP

Cách sử dụng mysqli_fetch_row() trong PHP

Hàm end() trong PHP

Hàm end() trong PHP

Cách sử dụng end() trong PHP

Hàm mysqli_field_count() trong PHP

Hàm mysqli_field_count() trong PHP

Cách sử dụng mysqli_field_count() trong PHP

Hàm count() trong PHP

Hàm count() trong PHP

Cách sử dụng count() trong PHP

Hàm mysqli_field_seek() trong PHP

Hàm mysqli_field_seek() trong PHP

Cách sử dụng mysqli_field_seek() trong PHP

Hàm compact() trong PHP

Hàm compact() trong PHP

Cách sử dụng compact() trong PHP

Hàm mysqli_field_tell() trong PHP

Hàm mysqli_field_tell() trong PHP

Cách sử dụng mysqli_field_tell() trong PHP

Hàm array_values() trong PHP

Hàm array_values() trong PHP

Cách sử dụng array_values() trong PHP

Hàm mysqli_free_result() trong PHP

Hàm mysqli_free_result() trong PHP

Cách sử dụng mysqli_free_result() trong PHP

Hàm array_unshift() trong PHP

Hàm array_unshift() trong PHP

Cách sử dụng array_unshift() trong PHP

Hàm mysqli_get_charset() trong PHP

Hàm mysqli_get_charset() trong PHP

Cách sử dụng mysqli_get_charset() trong PHP

Hàm array_shift() trong PHP

Hàm array_shift() trong PHP

Cách sử dụng array_shift() trong PHP

Hàm mysqli_get_client_stats() trong PHP

Hàm mysqli_get_client_stats() trong PHP

Cách sử dụng mysqli_get_client_stats() trong PHP

Hàm array_unique() trong PHP

Hàm array_unique() trong PHP

Cách sử dụng array_unique() trong PHP

Hàm mysqli_get_client_version() trong PHP

Hàm mysqli_get_client_version() trong PHP

Cách sử dụng mysqli_get_client_version() trong PHP

Hàm array_uintesect() trong PHP

Hàm array_uintesect() trong PHP

Cách sử dụng array_uintesect() trong PHP

Hàm mysqli_get_connection_stats() trong PHP

Hàm mysqli_get_connection_stats() trong PHP

Cách sử dụng mysqli_get_connection_stats() trong PHP

Hàm array_sum() trong PHP

Hàm array_sum() trong PHP

Cách sử dụng array_sum() trong PHP

Hàm mysqli_get_host_info() trong PHP

Hàm mysqli_get_host_info() trong PHP

Cách sử dụng mysqli_get_host_info() trong PHP

Top