Học về Negative Và Positive Lookbehind Regular Expression trong PHP

Học về Negative Và Positive Lookbehind Regular Expression trong PHP là vấn đề được nhiều lập trình viên quan tâm, bởi những kiến thức trên trường lớp là không đủ, vì vậy bài Học về Negative Và Positive Lookbehind Regular Expression trong PHP sẽ chia sẻ tới bạn nhiều thông tin hữu ích

Mọi người vẫn hỏi tôi về việc học lập trình nói chung và PHP nói riêng có cần năng khiếu hay quá khó để tiếp cận hay không. Thì tôi có thể trả lời rằng, học lập trình cũng như việc bạn học tiếng Anh hay bất kỳ một ngôn ngữ khác, bởi lập trình...là ngôn ngữ của máy tính, để máy tính đọc và máy tính thực hiện theo yêu cầu của mình, bạn thích là học được.

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 Lookbehind và Positive 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.

Để 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, Hoidapcode@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:

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

Bài giải:

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


Kết quả:  Array  (
      [0] => Array          (
              [0] => @facebook.com
              [1] => @Hoidapcode.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ề.

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

Hy vọng với bài viết về Học về Negative Và Positive Lookbehind Regular Expression trong PHP đã giải đáp giúp bạn phần nào về kiến thức lập trình PHP. Như tôi đã nói, ngôn ngữ lập trình không quan trọng bằng tư duy giải thuật, tư duy logic để giải quyết vấn đề.

Với những năm trước đây, lập trình viên là một cái nghề khó và kén chọn người học, đồng nghĩa với việc thu nhập hàng tháng của các lập trình viên luôn cao. Còn những năm gần đây, thì lập trình là môn học phổ thông, và ai cũng nên học một ngôn ngữ lập trình nào đó.

Nếu bạn còn bất kỳ câu hỏi nào trong việc học lập trình online, hãy gửi yêu cầu cho tôi qua email hoidapcode.com@gmail.com hoặc để lại comment bên dưới, tôi sẽ giải đáp trong vòng 24 giờ!

Blog hoidapcode.com là blog được tổng hợp tự động các bài học, thông tin về lập trình trên mạng internet. Nếu bạn có ý kiến hoặc đóng góp về bài viết này, hãy liên hệ với tôi!