Hướng dẫn dùng regex perl trong PHP

Hướng dẫn dùng regex perl trong PHP

Trong bài hướng dẫn tự học PHP này, bạn sẽ tìm hiểu cách các biểu thức chính quy hoạt động, cũng như cách sử dụng chúng để thực hiện khớp mẫu trong PHP.

Hướng dẫn dùng regex perl trong PHP
Biểu thức chính quy trong PHP

Biểu thức chính quy, thường được gọi là ‘regex‘ hoặc ‘RegExp‘, là một chuỗi văn bản có định dạng đặc biệt được sử dụng để tìm các mẫu trong văn bản.

Biểu thức chính quy là một trong những công cụ mạnh nhất hiện nay để xử lý hiệu quả công việc liên quan đến văn bản hiệu.

Ví dụ: Nó có thể được sử dụng để xác minh xem định dạng của dữ liệu như tên, email, số điện thoại, v.v. mà người dùng nhập có chính xác định dạng hay không, xác định mẫu để thay thế chuỗi phù hợp trong nội dung văn bản, v.v.

PHP (phiên bản 5.3 trở lên) hỗ trợ các biểu thức chính quy như ngôn ngữ Perl thông qua hàm preg_.

Tại sao lại giống như Perl?

Bởi vì Perl là ngôn ngữ lập trình chính thống đầu tiên cung cấp sự hỗ trợ tích hợp cho các biểu thức chính quy và Perl được nhiều lâp trình viên biết đến với sự hỗ trợ mạnh mẽ các biểu thức chính quy và khả năng xử lý văn bản đặc biệt hiệu quả của nó.

Chúng ta hãy bắt đầu với một số hàm tích hợp của PHP thường được sử dụng để thực hiện các so khớp các biểu thức chính quy.

HàmTác dụng
preg_match() Thực hiện khớp biểu thức chính quy
preg_match_all() Thực hiện khớp biểu thức chính quy toàn cục
preg_replace() Thực hiện tìm kiếm biểu thức chính quy và thay thế
preg_grep() Trả về các phần tử của mảng đầu vào và khớp mẫu
preg_split() Tách một chuỗi con bằng biểu thức chính quy
preg_quote() Trích dẫn các ký tự biểu thức chính quy được tìm thấy trong một chuỗi

Lưu ý: Hàm preg_match() của PHP ngừng tìm kiếm sau khi nó tìm thấy so khớp đầu tiên, trong khi hàm preg_match_all() tiếp tục tìm kiếm cho đến cuối chuỗi và tìm thấy tất cả các mẫu so khớp có thể thay vì dừng lại ở lần so khớp đúng đầu tiên.

Cú pháp của Biểu thức chính quy

Cú pháp biểu thức chính quy bao gồm việc sử dụng các ký tự đặc biệt (không nên nhầm lẫn với các ký tự đặc biệt HTML).

Các ký tự được cho ý nghĩa đặc biệt trong một biểu thức chính quy là :

. * ? + [ ] () {} ^ $ | \\

Bạn sẽ cần đặt ký tự \ trước các ký tự này bất cứ khi nào bạn muốn sử dụng chúng theo nghĩa đen.

Ví dụ: Nếu bạn muốn khớp ‘.‘, Bạn phải viết \.

Các phần sau đây mô tả các tùy chọn khác nhau có sẵn để xây dựng các mẫu:

Quy tắc xây dựng Biểu thức chính quy trong PHP

Dấu ngoặc vuông bao quanh một mẫu ký tự được gọi là lớp ký tự, ví dụ như: [abc].

Một lớp ký tự luôn khớp một ký tự trong danh sách các ký tự được chỉ định có nghĩa là biểu thức [abc] chỉ khớp với ký tự a, b hoặc c.

Các lớp ký tự phủ định cũng có thể được định nghĩa khớp với bất kỳ ký tự nào ngoại trừ các ký tự có trong ngoặc.

Một lớp ký tự phủ định được xác định bằng cách đặt ký hiệu dấu mũ (^) ngay sau dấu ngoặc mở, như thế này [^ abc].

Bạn cũng có thể xác định một phạm vi các ký tự bằng cách sử dụng ký tự gạch nối (-) bên trong một lớp ký tự, như [0-9]. Hãy xem xét một số ví dụ về các lớp ký tự:

RegExpMô tả
[abc] Khớp với bất kỳ một trong các ký tự a, b hoặc c.
[^abc] Khớp với bất kỳ một ký tự nào ngoại trừ a, b hoặc c.
[a-z] Khớp bất kỳ một ký tự từ chữ thường từ a đến z
[A-Z] Khớp bất kỳ một ký tự từ chữ HOA từ a đến z
[a-Z] Khớp bất kỳ một ký tự từ chữ thường a đến chữ HOA Z
[0-9] Khớp một chữ số duy nhất trong khoảng từ 0 đến 9.
[a-z0-9] Khớp một ký tự đơn giữa a và z hoặc giữa 0 và 9

Ví dụ sau đây sẽ cho bạn thấy cách tìm xem một mẫu có tồn tại trong chuỗi hay không bằng cách sử dụng biểu thức chính quy và hàm preg_match() của PHP:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){
    echo "Trùng khớp!";
} else{
    echo "Không tìm thấy.";
}
?>

Tương tự, bạn có thể sử dụng hàm preg_match_all() để tìm tất cả các kết quả khớp trong một chuỗi:

<?php
  $pattern = "/ca[kf]e/";
  $text = "He was eating cake in the cafe.";
  $matches = preg_match_all($pattern, $text, $array);
  echo $matches . " mẫu được tìm thấy.";
?>

Lưu ý: Các biểu thức chính quy không chỉ dành riêng cho PHP. Các ngôn ngữ như Java, Perl, Python, v.v … sử dụng cùng một ký hiệu để tìm các mẫu trong văn bản.

Bộ định lượng trong Biểu thức chính quy

Trong phần trước, chúng ta đã học cách kết hợp một ký tự trong nhiều kiểu khác nhau. Nhưng nếu bạn muốn so khớp ký tự nào đó xuất hiện nhiều lần thì sao?

Ví dụ: Giả sử bạn muốn tìm ra các từ có chứa một hoặc nhiều phiên bản của chữ p hoặc các từ có chứa ít nhất hai chữ p, v.v.

Đây là định lượng phát huy tác dụng. Với các bộ lượng hóa, bạn có thể chỉ định số lần một ký tự trong biểu thức chính quy cần phải so khớp.

Bảng sau liệt kê các cách khác nhau để định lượng một mẫu cụ thể:

RegExpMô tả
p+ Khớp với một hoặc nhiều lần xuất hiện của chữ p
p* Khớp 0 hoặc nhiều lần xuất hiện của chữ p.
p? Khớp 0 hoặc một lần xuất hiện của chữ p.
p{2} Khớp chính xác hai lần xuất hiện của chữ p
p{2,3} Khớp ít nhất hai lần xuất hiện của chữ p, nhưng không quá ba lần xuất hiện của chữ p.
p{2,} Khớp hai hoặc nhiều lần xuất hiện của chữ p
p{,3} Khớp nhiều nhất ba lần xuất hiện của chữ p

Biểu thức chính quy trong ví dụ sau sẽ phân tách chuỗi theo dấu phẩy, chuỗi dấu phẩy, khoảng trắng hoặc kết hợp của nó bằng cách sử dụng hàm preg_split() của PHP:

<?php
  $pattern = "/[\s,]+/";
  $text = "My favourite colors are red, green and blue";
  $parts = preg_split($pattern, $text);
 
  // Loop through parts array and display substrings
  foreach($parts as $part){
    echo $part . "<br>";
  }
?>

So khớp dựa theo vị trí trong biểu thức chính quy

Có một số tình huống mà bạn muốn so khớp ở đầu hoặc cuối của một dòng, từ hoặc một chuỗi. Để làm điều này, bạn có thể sử dụng neo vị trí.

Hai vị trí neo phổ biến là:

  • Dấu mũ (^) đại diện cho phần bắt đầu của chuỗi
  • Ký hiệu đô la ($) đại diện cho phần cuối của chuỗi.
RegExpMô tả
^p So khớp với chữ p ở đầu dòng
p$ So khớp với chữ p ở cuối dòng

Biểu thức chính quy trong ví dụ sau sẽ chỉ hiển thị các tên bắt đầu bằng chữ “J” từ một mảng tên bằng cách sử dụng hàm preg_grep() của PHP:

<?php
  $pattern = "/^J/";
  $names = array("Jhon Carter", "Clark Kent", "John Rambo");
  $matches = preg_grep($pattern, $names);
 
  // lặp qua các matches và hiển thị chúng
  foreach($matches as $match){
    echo $match . "<br>";
  }
?>

Sửa đổi Pattern trong Biểu thức chính Quy

Công cụ sửa đổi pattern cho phép bạn kiểm soát cách xử lý khớp mẫu. Công cụ sửa đổi mẫu được đặt trực tiếp sau biểu thức chính quy.

Ví dụ: Nếu bạn muốn tìm kiếm mẫu theo cách không phân biệt chữ hoa chữ thường, bạn có thể sử dụng công cụ sửa đổi i, như sau: / pattern / i.

Bảng sau liệt kê một số công cụ sửa đổi mẫu được sử dụng phổ biến nhất:

ModifierMô tả
i Không phân biệt chữ HOA – chữ thường
m Thay đổi hành vi của ^ và $ để khớp với ranh giới dòng mới (nghĩa là bắt đầu hoặc kết thúc mỗi dòng trong một chuỗi nhiều dòng), thay vì ranh giới chuỗi.
g Thực hiện khớp toàn cục, tìm thấy tất cả các lần xuất hiện
o Đánh giá biểu thức chỉ một lần.
s Thay đổi hành vi của. (dấu chấm) để khớp với tất cả các ký tự, bao gồm cả dòng mới.
x Cho phép bạn sử dụng khoảng trắng và comment trong một biểu thức chính quy cho rõ ràng.

Ví dụ sau đây sẽ cho bạn thấy cách thực hiện tìm kiếm không phân biệt chữ hoa chữ thường bằng cách sử dụng công cụ sửa đổi i và hàm preg_match_all() của PHP:

<?php
  $pattern = "/color/i";
  $text = "Color red is more visible than color blue in daylight.";
  $matches = preg_match_all($pattern, $text, $array);
  echo $matches . " matches were found.";
?>

Tương tự, ví dụ sau đây cho thấy cách so khớp ở đầu mỗi dòng trong chuỗi nhiều dòng bằng cách sử dụng neo vị trí đầu với ký tự mũ (^) và (m) với hàm preg_match_all() của PHP:

<?php
  $pattern = "/^color/im";
  $text = "Color red is more visible than \ncolor blue in daylight.";
  $matches = preg_match_all($pattern, $text, $array);
  echo $matches . " matches were found.";
?>

Ranh giới các từ trong Biểu thức chính quy

Một ký tự ranh giới từ (\b) giúp bạn tìm kiếm các từ bắt đầu và / hoặc kết thúc bằng một mẫu.

Ví dụ: Mẫu /\bcar/ khớp với các từ bắt đầu bằng mẫu car và sẽ khớp với cart, carot hoặc cartoon, nhưng sẽ không khớp với từ oscar.

Tương tự, Mẫu /car\b/ khớp với các từ kết thúc bằng mẫu xe và sẽ khớp với car, oscar hoặc supercar, nhưng sẽ không khớp với cart, cartoon, carot.

Tương tự, /\bcar\b/ so khớp với các từ bắt đầu và kết thúc với từ car. Do đó nó sẽ chỉ khớp với từ car

Ví dụ sau đây sẽ làm nổi bật các từ bắt đầu bằng car in đậm:

<?php
  $pattern = '/\bcar\w*/';
  $replacement = '<b>$0</b>';
  $text = 'Words begining with car: cart, carrot, cartoon. Words ending 
  with car: scar, oscar, supercar.';
  echo preg_replace($pattern, $replacement, $text);
?>

Tham khảo PHP Cheat Sheet

Hướng dẫn dùng regex perl trong PHP
PHP Cheat Sheet

Lời Kết

Mình hy vọng bạn đã hiểu những điều cơ bản của Biểu thức chính quy trong PHP. Để tìm hiểu cách xác thực dữ liệu biểu mẫu bằng biểu thức chính quy, bạn có thể xem lại bài hướng dẫn về Xác thực biểu mẫu với PHP.

Lưu ý, đôi khi để gia tăng trải nghiệm người dùng, bạn không cần so khớp quá chính xác.