Tìm kiếm và thay thế trong xâu với Regular Expression PHP
Tìm kiếm và thay thế trong xâu với Regular Expression
Ở bài trước, chúng ta đã xem xét qua một số hàm thường gặp khi xử lý xâu trong PHP. Để tìm kiếm trong xâu, ta có thể dùng strpos() hoặc substr(), nhưng với những hàm này ta chỉ có thể tìm kiếm một cách hết sức hạn chế. Hãy thử tưởng tượng, nếu bạn muốn kiểm tra xem 1 xâu có phải là một địa chỉ IP, hay một địa chỉ email đúng đắn hay ko, sẽ phải sử dụng rất nhiều câu lệnh if.
Trong những trường hợp như thế này, ta sẽ sử dụng Regular Expression. Regular Expression, viết tắt là RegEx, có rất nhiều định nghĩa. Đây là một trong số các định nghĩa đơn giản nhất:
Regular Expression là một cách thức thể hiện dữ liệu dưới dạng các ký tự đại diện. Nó được dùng trong các thuật toán tìm kiếm, thay thế xâu.
Đây là ví dụ về một RegEx dùng để kiểm tra xem một xâu có phải là địa chỉ IP đúng đắn hay ko:
Code:
([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})
Nhìn thì có vẻ rất phức tạp chứ thực ra RegEx trên rất đơn giản và dễ hiểu một khi bạn đã nắm được cách sử dụng.
Ta sẽ quay trở lại ví dụ trên sau khi đã học được một số điều cần thiết. Giờ hãy dành thời gian vào việc tìm hiểu cú pháp, cách viết 1 RegEx:
1.RegEx CÓ phân biệt ký tự hoa – thường. (case sensitive)
Ví dụ ta có một xâu như sau:
Code:
Hello, UDS
Khi đó RegEx Hello sẽ phù hợp với phần đầu của xâu nói trên, còn hello thì ko.
2. Mọi ký tự trong RegEx đều ứng với một ký tự trong xâu cần kiểm tra, kể cả ký tự trắng (dấu cách, dấu tab, dấu xuống dòng).
Ví dụ với xâu:
Code:
Hello, UDS
Thì Hello, UDS sẽ phù hợp còn Hello, UDS ko.
3. Một số ký tự có ý nghĩa đặc biệt. Ký tự ^ chỉ sự bắt đầu một xâu, còn $ chỉ sự kết thúc.
Ví dụ: Xâu
Code:
UDS is UDS
^UDS sẽ phù hợp với đoạn UDS đầu xâu, trong khi UDS$ sẽ phù hợp với đoạn UDS cuối xâu.
4. Cũng như trong PHP, ký tự \ được sử dụng để escape một số ký tự đặc biệt. Ví dụ \$, \^, \-
Xâu:
Code:
$abc$
\$ phù hợp với ký tự $ đầu xâu.
5. Ký tự . phù hợp với mọi ký tự
Ví dụ:
RegEx … phù hợp với 3 ký tự đầu trong xâu
Code:
UDS is a great community!!!
Dĩ nhiên, để 1 ký tự trong RegEx phù hợp với dấu . (thật) thì cần phải escape dấu . ấy như thế này \.
Ví dụ:
Code:
O.K.
\. sẽ phù hợp với dấu . thứ nhất sau ký tự O.
6. Một danh sách các ký tự có thể đặt trong dấu ngoặc vuông []. Khi đó bất cứ ký tự nào trong ngoặc vuông được tìm thấy, ký tự đó sẽ được coi là phù hợp. Trật tự các ký tự trong ngoặc là ko quan trọng.
Ví dụ:
Code:
How do you do?
[oyu] sẽ phù hợp với ký tự o trong từ How
[dH]. sẽ phù hợp với ký tự Ho trong từ How.
7. Một dải (range) các ký tự có thể được thể hiện bằng cú pháp [ – ]. Có thể có nhiều dải trong một cặp ngoặc [].
Ví dụ:
Code:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
[C-K] sẽ phù hợp với ký tự C.
[a-d] sẽ phù hợp với ký tự a.
[C-Ka-d2-6] sẽ phù hợp với ký tự C.
8. Nếu một lớp các ký tự đặt trong dấu [] được mở đầu bằng ký tự ^, những ký tự đó sẽ được coi là ko phù hợp.
Ví dụ:
Code:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789
[^CDghi45] sẽ ko phù hợp với các ký tự C, D, g, h, i, 4, 5.
9. Các xâu khác nhau có thể được đặt trong dấu () và phân cách bằng ký tự |.
Ví dụ:
Code:
Monday Tuesday Friday
(on|ues|rida) sẽ phù hợp với đoạn on trong từ Monday, ues trong từ Tuesday,…
10. Có thể chỉ ra số lần ký tự sẽ xuất hiện. Ký tự * phù hợp với "ko hoặc nhiều hơn thế", + phù hợp với "một hoặc nhiều hơn thế", ? phù hợp với "ko hoặc một".
Ví dụ:
Code:
aabc abc bc
a*b hoặc a+b phù hợp với aab.
a?b phù hợp với ab.
11. Dấu ngoặc móc {} được sử dụng để chính xác hóa số lượng ký tự ta mong muốn. Trong đó:
{m} cho biết ký tự xuất hiện ĐÚNG m lần
{m,n} cho biết ký tự xuất hiện ÍT NHẤT m lần và NHIỀU NHẤT n lần.
{m,} cho biết ký tự xuất hiện ÍT NHẤT m lần.
{,n} cho biết ký tự xuất hiện NHIỀU NHẤT n lần.
Ví dụ:
Code:
One ring to bring them all and in the darkness bind them
.{5} sẽ phù hợp với đoạn ký tự One r.
[els]{1,3} sẽ phù hợp với ký tự e.
[a-z]{3,} sẽ phù hợp với đoạn ring.
Cần chú ý: "*", "+", và "?" là trường hợp đặc biệt của luật thứ 11. "*" tương ứng với {0,}, "+" tương ứng với {1,} còn "?" tương ứng với {0,1}.
Vậy, trên đây tớ đã giới thiệu một số luật quan trọng và cần nhớ khi sử dụng Regular Expression để tìm kiếm và thay thế trong xâu. Bài tiếp theo sẽ nói tới một số ví dụ vể Regular Expression và việc áp dụng vào PHP.
Các bạn có thể tham khảo thêm về Regular Expression ở Zvon:
RegEx Tutorial: http://www.zvon.org/other/PerlTutori…put/index.html
RegEx Reference: http://www.zvon.org/other/reReference/Output/index.html
Chính bài viết này cũng đã được dịch từ RegEx Tutorial.
identical(UDS)