RegEx trong PHP

Regex là các mẫu [pattern] thay vì các chuỗi cụ thể được sử dụng tìm/thay thế [Find/Replace]. Là một công cụ cực mạnh cho xử lí chuỗi trong Php, javascript… Ví dụ: Khi kiểm tra tính hợp lệ của email hoặc số điện thoại thì điều bạn nghĩ tới đầu tiên chính là regex. Regex là viết tắt của Regular Expression, tên thuần Việt là biểu thức chính quy.

2.Các cú pháp cơ bản Regular Expression

Nói chung là Regex còn nhiều ứng dụng hữu ích khác, tóm gọn lại một chút là hiểu đơn giản thì regex là một chuỗi các kí tự miêu tả một bộ các chuỗi ki tự khác, theo những quy tắc và cú pháp nhất định.

Ảnh: Mastercode

Không phải lúc nào cũng nên dùng regex, mỗi ngôn ngữ sẽ có cú pháp áp dụng regex khác nhau, nhưng không sao vai trò của ngôn ngữ ở đây không quan trọng lắm.

  Học Regular Expression và cuộc đời bạn sẽ bớt khổ [Updated v2.2]

3.Ứng dụng Regex

Một số ví dụ nhẹ nhàng cho Php hoặc Javascript nhé, như đã nói vai trò của ngôn ngữ không quan trọng lắm, 1 chút google sẽ ra các đoạn code mình cần dùng.

Nhắc lại: Nguyên tắc hoạt động của biểu thức RegEx là so khớp dựa vào mẫu [pattern], mẫu được xây dựng từ các quy tắc căn bản của biểu thức RegEx. Và để các bạn nắm rõ regular expression là gì thì có một hàm xử lý Regular Expression trong php đó là hàm preg_match, sau đó đưa ra một vài ví dụ nhỏ để các bạn thực hành trước khi tìm hiểu các phần nâng cao hơn.

3.1 Hàm Preg_match trong php

Cú pháp là: preg_match[$pattern, $subject, $matches]

  • $pattern là chuỗi Regex Pattern
  • array
      0 => string '123' [length=3]
    0 là chuỗi nguồn để chúng ta so khớp với $pattern
  • array
      0 => string '123' [length=3]
    2 là danh sách kết quả trả về đúng khi so khớp 2 chuỗi trên

VD 1: kiểm tra mội chuỗi là số

if [preg_match['/^[0-9]+$/', '123', $matches]]{
    var_dump[$matches];
}

Kết quả:

array
  0 => string '123' [length=3]

VD 2: Kiểm tra một chuỗi là các ký tự thường

if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{
    var_dump[$matches];
}

Kết quả

array
  0 => string 'topdev' [length=6]

VD 3: Kiểm tra một chuỗi là các ký tự hoa

if [preg_match['/^[A-Z]+$/', 'TOPDEV', $matches]]{
    var_dump[$matches];
}

Kết quả

array
  0 => string 'TOPDEV' [length=6]

3.2 Tạo 1 Regular Expressions trong JS

Trong Javascript thì Regular Expression là một chuỗi nhưng nó không được bao quanh bởi cặp dấu nháy đơn 

array
  0 => string '123' [length=3]
3 hoặc nháy kép 
array
  0 => string '123' [length=3]
4 mà nó được bao quanh bởi cặp dấu 
array
  0 => string '123' [length=3]
5. Có 2 cách tạo:

Cú pháp: 

array
  0 => string '123' [length=3]
6

VD:

var regexConst = new RegExp['abc'];

Hoặc sử dụng dấu

array
  0 => string '123' [length=3]
5

Cú pháp:

array
  0 => string '123' [length=3]
8

Trong đó:

  • array
      0 => string '123' [length=3]
    9 là chuỗi Regular Expression
  • if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{
        var_dump[$matches];
    }
    0 là thông số cấu hình cho chuỗi pattern và nó có các giá trị:
    • if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{
          var_dump[$matches];
      }
      1 : so khớp không quan tâm đến chữ hoa chữ thường
    • if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{
          var_dump[$matches];
      }
      2 : so khớp toàn bộ chuỗi cần tìm
    • if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{
          var_dump[$matches];
      }
      3 : so khớp luôn cả các dữ liệu xuống dòng [multiline]

Ví dụ: Pattern kiểm tra chuỗi có tồn tại chữ “topdev” không, không phân biệt chữ hoa chữ thường và tìm toàn bộ tài liệu.

var pattern = /topdev/igm;
  • pattern là topdev
  • flags là igm

4.Cách viết Regex chi tiết

Trong Regex có vài cái khá là điển hình và được sử dụng rất nhiều bao gồm so khớp chuỗi, tách chuỗi, tìm kiếm trong chuỗi, thay thế chuỗi… Các cách sử dụng chi tiết Regex trong Javascript bạn có thể tham khảo chi tiết tại đây nhé hoặc ở đây.

Biểu thức chính quy hay là Regular Expression[RegEx], là một chuỗi các ký tự tạo thành một mẫu tìm kiếm, được sử dụng để xử lý một chuỗi và kiểm tra chuỗi một cách chi tiết hơn. Việc xử lý chuỗi sẽ được thông qua một biểu thức riêng, biểu thức này lại có những nguyên tắc riêng và ta phải tuân thủ theo nguyên tắc đó thì biểu thức của ta mới hoạt động được.

Biểu thức chính quy có thể được sử dụng để thực hiện tất cả các hoạt động tìm kiếm văn bản hay thay thế văn bản. Biểu thức chính quy có thể là một ký tự đơn hoặc một mẫu phức tạp hơn.

2. Cú pháp trong biểu thức chính quy

Trong PHP, biểu thức chính quy là các chuỗi gồm dấu phân cách, một mẫu hoặc các biểu mẫu tùy chọn.

Ý nghĩaVí dụ^Bắt đầu chuỗi nhập^B$Kết thúc chuỗi nhậpX$.Bất kỳ ký tự nào ngoại từ ký tự xuống dòng[\n]i.ation*Ký tự trước có thể lặp lại 0 hoặc nhiều lầnra*t+Ký tự trước có thể lặp lại 1 hoặc nhiều lầnra+t?Ký tự trước có thể lặp lại 0 hoặc 1 lầnra?t\sBất kỳ ký tự khoảng trắng\sa\SBất kỳ ký tự nào không phải là khoảng trắng\SF\bTừ biênion\b\BBất kỳ ký tự nào không phải là từ biên\BX\B3. Hàm thông dụng trong biểu thức chính quy trong PHP

3.1. Hàm preg_match

Cú pháp: preg_match[$pattern, $subject, $matches, $flags, $offset];

Trong đó:

  • $pattern : là chuỗi của biểu thức chính quy.
  • $subject : là chuỗi cần so khớp.
  • $matches : là kết quả trả về, được truyền vào dưới dạng tham chiếu[có thể trống].
  • $flags : là tham số chỉ ra vị trí cắt chuỗi so khớp[có thể trống].
  • $offset : là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi[có thể trống].

Hàm này sẽ trả về 1 cho ta nếu chuỗi được tìm thấy và ngược lại trả về 0 nếu không tìm thấy chuỗi[ta có thể coi tương tự như True và False]. Sử dụng biểu thức chính quy để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường trong một chuỗi.

Ví dụ 1:

Ví dụ 2: kiểm tra một chuỗi là ký tự thường

if [preg_match['/^[a-z]+$/', 'laptrinhtudau', $matches]]{
    var_dump[$matches];
}

Ví dụ 3 : kiểm tra một chuỗi là ký tự hoa

if [preg_match['/^[A-Z]+$/', 'LAPTRINHTUDAU', $matches]]{
    var_dump[$matches];
}

3.2. Hàm preg_match_all

Cú pháp: preg_match[$pattern, $subject, $matches, $flags, $offset];

Trong đó:

  • $pattern : là chuỗi của biểu thức chính quy.
  • $subject : là chuỗi cần so khớp.
  • $matches : là kết quả trả về, được truyền vào dưới dạng tham chiếu[có thể trống].
  • $flags : là tham số chỉ ra vị trí cắc chuỗi so khớp[có thể trống].
  • $offset : là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi[có thể trống].

Hàm này giúp ta so khớp tất cả các đoạn khớp trong chuỗi. Còn preg_match thì sẽ chỉ so khớp đoạn đầu tiên còn phần sau nó sẽ bỏ qua. Hàm preg_match_all sẽ trả về số lần mẫu được tìm thấy trong chuỗi, cũng có thể là 0.

Ví dụ:

3.2. Hàm preg_replace

Cú pháp: preg_replace[$pattern, $replacement, $subject, $limit, $count];

Trong đó:

  • $pattern : là chuỗi regex cần tìm kiếm.
  • $replacement : là chuỗi thay thế cho chuỗi vừa tìm được.
  • $subject : là chuỗi mà ta cần tìm và thay thế.
  • $limit : là giới hạn số lần thay thế chuỗi mặc định là -1 là không giới hạn[có thể bỏ trống].
  • $count : là số lần thay thế chuỗi khi sử dụng một hàm, dưới dạng tham chiếu[có thể bỏ trống].

Ví dụ:

Hàm này sẽ giúp ta trả về một chuỗi mới trong đó các mẫu phù hợp đã được thay thế bằng một chuỗi khác.

4. Cách viết Regex chi tiết

Tôi sẽ trình bày phần này ra thành từng mục nhỏ và ở trong các bảng để các bạn dễ nhìn và có thể so sánh chúng dễ hơn nhé!

4.1. Sửa đổi biểu thức

Biểu thứcÝ nghĩaiTìm kiếm mà không phân biệt chữ hoa chữ thườngmTìm kiếm nhiều dònguĐối sánh chính xác các mẫu được mã hóa UTF-8

4.2. Ký tự thường

Biểu thứcÝ nghĩaChú ýa | bTìm một ký tự khớp với a hoặc b[0 – 9]Tìm một ký tự khớp với số từ 1 đến 9[a – z]Khớp với những chữ từ a tới z[abc]Có thể khớp với a, b hoặc c[^abc]Không khớp với a b hay cDấu ^ xuất hiện sau dấu ngoặc vuông thì là phủ định\dSố bất kỳThay thế cho [0-9]\DKý tự không phải là sốThay thế [^0-9]\sKý tự khoảng trắng\SKhông phải ký tự khoảng trắngThay thế [^\s]\wKý tự chữ\WKý tự không phải chữThay thế [^\w]\bKý tự thuộc a-z hoặc A-Z hoặc 0-9 hoặc _

4.2. Ký tự đặc biệt

Biểu thứcÝ nghĩa|Tìm kết quả phù hợp cho bất kỳ một trong các mẫu [tương tự or].Chỉ tìm một trường hợp của bất kỳ ký tự nào, khớp với bất kỳ ký tự đơn nào ngoài \^Tìm kết quả phù hợp ở đầu một chuỗi$Tìm kết quả phù hợp ở cuối chuỗi\dTìm một chữ số\sTìm một ký tự khoảng trắng\bTìm một kết quả phù hợp ở đầu một từ hoặc cuối một từ\uxxxxTìm ký tự unicode được chỉ định bởi số lục phân xxxx/Bắt đầu hoặc kết thúc chuỗi regex\Biểu diễn một ký tự ngay sau nó từ ký tự đặc biệt thành ký tự thường và ngược lại

4.3. Bộ định lượng

Biểu thứcÝ nghĩan+Khớp với bất kỳ chuỗi nào có chứa ít nhất một nn*Khớp với bất kỳ chuỗi nào không có hoặc có nhiều lần xuất hiện của nn?Khớp với bất kỳ chuỗi nào có chứa 0 hoặc một lần xuất hiện của nn{x}Khớp với bất kỳ chuỗi nào chứa một chuỗi X nn{x,y}Khớp với bất kỳ chuỗi nào có chứa chuỗi X với chuỗi Y nn{x,}Đối sánh bất kỳ chuỗi nào có chứa ít nhất một chuỗi gồm X n

4.4. Khớp nhóm

Biểu thứcÝ nghĩa[]Chọn các phần từ của mẫu được sử dụng làm đối sánh[? : x]Khớp với x nhưng không rõ kết quả khớpx[?=y]Chỉ khớp với x nếu ngay sau x là yX[?!y]Chỉ khớp với x nếu ngay sau x không là y5. Ưu điểm và nhược điểm của biểu thức chính quy

Không chỉ PHP mà ở các ngôn ngữ khác đều hỗ trợ regex. Và qua những gì tôi đã giới thiệu ở trên ta sẽ rút ra một số ưu nhược điểm của regex nhé!

5.1. Ưu điểm

Vì biểu thức chính quy có tác dụng để so khớp các dữ liệu đầu vào một cách chi tiết và cụ thể nên ta có thể rằng buộc được chi tiết các dữ liệu đầu vào một cách nhanh chóng và chính xác.

5.2. Nhược điểm

Chúng ta sẽ khó mà nắm bắt được vì biểu thức chính quy khá trìu tượng và rắc rối. Nó đòi hỏi ta phải có một chút tư duy logic, và sự tập trung nếu không ta có thể sẽ tạo ra biểu thức không khớp như kết quả mà ta muốn.

Chủ Đề