tek4

Regex trong PHP

by - September. 21, 2021
Kiến thức
Học
<p>Regex trong PHP l&agrave; một giải thuật quan trọng trong khi lập tr&igrave;nh bởi n&oacute; sẽ gi&uacute;p cho người lập tr&igrave;nh vi&ecirc;n thao t&aacute;c tốt hơn với dữ liệu cần thiết. Trong b&agrave;i viết n&agrave;y, ta sẽ c&ugrave;ng t&igrave;m hiểu về kh&aacute;i niệm n&agrave;y c&ugrave;ng với v&iacute; dụ dẫn chứng.</p> <h1>Regex trong PHP</h1> <p>Regex trong PHP hay biểu thức ch&iacute;nh quy trong PHP l&agrave; một chuỗi c&aacute;c k&yacute; tự tạo th&agrave;nh một mẫu t&igrave;m kiếm. Khi ta t&igrave;m kiếm dữ liệu trong một văn bản, ta c&oacute; thể sử dụng mẫu t&igrave;m kiếm n&agrave;y để m&ocirc; tả những g&igrave; đang t&igrave;m kiếm dựa tr&ecirc;n một quy tắc nhất định. Biểu thức ch&iacute;nh quy c&oacute; thể l&agrave; một k&yacute; tự hoặc một mẫu k&yacute; tự phức tạp hơn. Biểu thức ch&iacute;nh quy c&oacute; thể được sử dụng để thực hiện tất cả c&aacute;c loại hoạt động t&igrave;m kiếm văn bản v&agrave; thay thế văn bản.</p> <p>Trong PHP, biểu thức ch&iacute;nh quy l&agrave; c&aacute;c chuỗi bao gồm c&aacute;c dấu ph&acirc;n c&aacute;ch, mẫu v&agrave; c&aacute;c chỉ định t&ugrave;y chọn.</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic">$tim_kiem = "/Xin chao/i";</pre> <p>Trong v&iacute; dụ tr&ecirc;n, / l&agrave; dấu ph&acirc;n c&aacute;ch, Xin chao l&agrave; mẫu đang t&igrave;m kiếm v&agrave; i l&agrave; một chỉ định gi&uacute;p x&aacute;c định cho việc t&igrave;m kiếm nhằm đảm bảo kh&ocirc;ng ph&acirc;n biệt chữ hoa v&agrave; chữ thường. Dấu ph&acirc;n c&aacute;ch c&oacute; thể l&agrave; bất kỳ k&yacute; tự n&agrave;o m&agrave; kh&ocirc;ng phải l&agrave; chữ c&aacute;i, số, dấu gạch ch&eacute;o hoặc dấu c&aacute;ch. Dấu ph&acirc;n c&aacute;ch phổ biến nhất l&agrave; dấu gạch ch&eacute;o (/),khi đoạn mẫu t&igrave;m kiếm của ta chứa dấu gạch ch&eacute;o, ta c&oacute; thể chọn c&aacute;c dấu ph&acirc;n c&aacute;ch kh&aacute;c như # hoặc ~.</p> <h2>C&aacute;c h&agrave;m biểu thức ch&iacute;nh quy</h2> <p>PHP cung cấp nhiều h&agrave;m cho ph&eacute;p ta sử dụng c&aacute;c biểu thức ch&iacute;nh quy. C&aacute;c h&agrave;m preg_match(), preg_match_all() v&agrave; preg_replace() l&agrave; một số h&agrave;m được sử dụng phổ biến nhất.</p> <table> <tbody> <tr> <td style="text-align: center;">H&agrave;m</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td>preg_match()</td> <td>Trả về gi&aacute; trị 1 nếu mẫu được t&igrave;m thấy v&agrave; gi&aacute; trị 0 sẽ được trả về nếu kh&ocirc;ng được t&igrave;m thấy.</td> </tr> <tr> <td>preg_match_all()</td> <td>Trả về số lần m&agrave; mẫu được t&igrave;m thấy.</td> </tr> <tr> <td>preg_replace()</td> <td>Trả về một chuỗi k&yacute; tự mới với mẫu t&igrave;m kiếm được thay thế bằng một chuỗi kh&aacute;c.</td> </tr> </tbody> </table> <h3>1. Sử dụng h&agrave;m preg_match()</h3> <p>H&agrave;m preg_match() sẽ cho ta biết liệu một chuỗi k&yacute; tự c&oacute; chứa mẫu hay kh&ocirc;ng.</p> <p>V&iacute; dụ: T&igrave;m kiếm sự xuất hiện chuỗi k&yacute; tự PHP v&agrave; kh&ocirc;ng ph&acirc;n biệt chữ hoa hay chữ thường.</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php $a = "Lap trinh PHP"; $b = "/PHP/i"; echo preg_match($b, $a); ?&gt;</pre> <p>Kết quả:</p> <pre>1</pre> <p>Trong đoạn m&atilde; tr&ecirc;n, mẫu cần t&igrave;m kiếm l&agrave; PHP v&agrave; kh&ocirc;ng chỉ i được sử dụng để chỉ rằng việc t&igrave;m kiếm sẽ diễn ra v&agrave; kh&ocirc;ng ph&acirc;n biệt chữ hoa v&agrave; chữ thường.</p> <h3>2. Sử dụng h&agrave;m preg_match_all()</h3> <p>H&agrave;m preg_match_all() sẽ cho ta biết c&oacute; bao nhi&ecirc;u lần m&agrave; mẫu được t&igrave;m thấy trong một chuỗi k&yacute; tự.</p> <p>V&iacute; dụ: T&igrave;m kiếm số lần m&agrave; chuỗi "PHP" được t&igrave;m thấy trong chuỗi k&yacute; tự.</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php $a = "Lap trinh PHP va tim hieu ve bieu thuc chinh quy trong PHP"; $b = "/PHP/i"; echo preg_match_all($b, $a); ?&gt;</pre> <p>Kết quả:</p> <pre>2</pre> <h3>3. Sử dụng h&agrave;m preg_replace()</h3> <p>H&agrave;m preg_replace() sẽ thay thế tất cả c&aacute;c mẫu được t&igrave;m kiếm trong một chuỗi k&yacute; tự bằng một chuỗi kh&aacute;c.</p> <p>V&iacute; dụ: Thay thế chuỗi k&yacute; tự "Java" bằng chuỗi k&yacute; tự "PHP"</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php $a = "Lap trinh Java va tim hieu ve bieu thuc chinh quy trong Java"; $b = "/Java/i"; $c = "PHP"; $d = preg_replace($b, $c, $a); echo $a."&lt;br&gt;"; echo $d; ?&gt;</pre> <p>Kết quả:</p> <pre>Lap trinh Java va tim hieu ve bieu thuc chinh quy trong Java Lap trinh PHP va tim hieu ve bieu thuc chinh quy trong PHP</pre> <h2>C&aacute;c chỉ định cho biểu thức ch&iacute;nh quy</h2> <table> <tbody> <tr> <td style="text-align: center;">Chỉ định</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td>i</td> <td>Chỉ định việc t&igrave;m kiếm kh&ocirc;ng ph&acirc;n biệt chữ hoa v&agrave; chữ thường.</td> </tr> <tr> <td>m</td> <td>Chỉ định việc t&igrave;m kiếm tr&ecirc;n nhiều d&ograve;ng.</td> </tr> <tr> <td>u</td> <td>Chỉ định cho mẫu t&igrave;m kiếm được m&atilde; h&oacute;a UTF-8.</td> </tr> <tr> <td>g</td> <td>T&igrave;m to&agrave;n bộ tất cả c&aacute;c chuỗi khớp với mẫu cần t&igrave;m.</td> </tr> </tbody> </table> <h2>C&aacute;c mẫu biểu thức ch&iacute;nh quy</h2> <table> <tbody> <tr> <td style="text-align: center;">Biểu thức</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td>[abc]</td> <td>T&igrave;m kiếm 1 k&yacute; tự nằm trong dấu ngoặc.</td> </tr> <tr> <td>[^abc]</td> <td>T&igrave;m bất kỳ k&yacute; tự n&agrave;o kh&ocirc;ng nằm trong dấu ngoặc.</td> </tr> <tr> <td>[0-9]</td> <td>T&igrave;m 1 chữ số nằm trong khoảng từ 0 tới 9.</td> </tr> </tbody> </table> <h2>Si&ecirc;u k&yacute; tự</h2> <table> <tbody> <tr> <td style="text-align: center;">K&yacute; tự</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td>|</td> <td>T&igrave;m kiếm một mẫu ph&ugrave; hợp cho bất kỳ mẫu n&agrave;o được ph&acirc;n t&aacute;ch bởi dấu gạch dọc | v&iacute; dụ như PHP|Java|C++.</td> </tr> <tr> <td>.</td> <td>T&igrave;m một biểu hiện của bất kỳ k&yacute; tự n&agrave;o.</td> </tr> <tr> <td>^</td> <td>T&igrave;m một mẫu ph&ugrave; hợp ở đầu chuỗi k&yacute; tự.</td> </tr> <tr> <td>$</td> <td>T&igrave;m một mẫu ph&ugrave; hợp ở cuối chuỗi k&yacute; tự.</td> </tr> <tr> <td>\d</td> <td>T&igrave;m một số bất kỳ.</td> </tr> <tr> <td>\s</td> <td>T&igrave;m một k&yacute; tự khoảng trắng.</td> </tr> <tr> <td>\b</td> <td>T&igrave;m một mẫu ph&ugrave; hợp ở đầu hoặc cuối của chuỗi k&yacute; tự.</td> </tr> <tr> <td>\uxxxx</td> <td>T&igrave;m một k&yacute; tự Unicode được x&aacute;c định mới số hệ cơ số 16 xxxx.</td> </tr> </tbody> </table> <h2>Chỉ định lượng</h2> <table> <tbody> <tr> <td style="text-align: center;">Định lượng</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td>n+</td> <td>T&igrave;m kiếm bất kỳ chuỗi n&agrave;o m&agrave; chứa &iacute;t nhất 1 k&yacute; tự n.</td> </tr> <tr> <td>n*</td> <td>T&igrave;m kiếm bất kỳ chuỗi n&agrave;o m&atilde; chứa số lần xuất hiện của k&yacute; tự n.</td> </tr> <tr> <td>n?</td> <td>T&igrave;m kiếm bất kỳ chuỗi n&agrave;o chứa 1 hoặc 0 lần xuất hiện của k&yacute; tự n.</td> </tr> <tr> <td>n{x}</td> <td>T&igrave;m kiếm bất kỳ chuỗi n&agrave;o chứa một chuỗi c&aacute;c k&yacute; tự với số lần xuất hiện l&agrave; n lần.</td> </tr> <tr> <td>n{x,y}</td> <td>T&igrave;m kiếm bất kỳ chuỗi n&agrave;o chứa một chuỗi c&aacute;c k&yacute; tự n với số lần xuất hiện từ x tới y lần.</td> </tr> <tr> <td>n{x,}</td> <td>T&igrave;m kiếm bất kỳ chuỗi n&agrave;o chứa một chuỗi c&aacute;c k&yacute; tự n với số lần xuất hiện &iacute;t nhất l&agrave; x lần.</td> </tr> </tbody> </table> <p>Ch&uacute; &yacute;: Nếu biểu thức cần t&igrave;m kiếm một trong c&aacute;c k&yacute; tự đặc biệt, ta c&oacute; thể sử dụng dấu gạch ch&eacute;o ngược (\) để thực hiện việc t&igrave;m kiếm ch&uacute;ng. V&iacute; dụ: để t&igrave;m kiếm một hoặc nhiều dấu chấm hỏi, ta c&oacute; thể sử dụng biểu thức sau:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic">$a = '/ \? + /';</pre> <h2>Tập hợp</h2> <p>Ta c&oacute; thể sử dụng dấu ngoặc đơn() để &aacute;p dụng c&aacute;c định lượng cho to&agrave;n bộ mẫu t&igrave;m kiếm. Ch&uacute;ng cũng c&oacute; thể được sử dụng để chọn c&aacute;c phần của mẫu được sử dụng để t&igrave;m kiếm.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php $a = "Lap trinh PHPPHP va tim hieu ve bieu thuc chinh quy!"; $b = "/(PHP){2}/i"; echo preg_match($b, $a); ?&gt;</pre> <p>Kết quả:</p> <pre>1</pre> <p>Trong đoạn m&atilde; tr&ecirc;n, ta đ&atilde; sử dụng biểu thức ch&iacute;nh quy như sau:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic">/(PHP){2}/i</pre> <p>Trong đ&oacute; PHP l&agrave; chuỗi cần t&igrave;m, {2} l&agrave; 2 lần lặp lại chuỗi PHP trong chuỗi cần t&igrave;m v&agrave; chỉ định i được sử dụng để kh&ocirc;ng ph&acirc;n biệt chữ hoa hay chữ thường. Trong chuỗi k&yacute; tự m&agrave; ta đang thực hiện việc t&igrave;m kiếm tr&ecirc;n n&oacute;.</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic">Lap trinh PHPPHP va tim hieu ve bieu thuc chinh quy!</pre> <p>Gồm c&oacute; 1 chuỗi lặp lại 2 lần chữ PHP. Như vậy, kết quả nhận được sẽ l&agrave; 1.</p> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về Regex trong PHP. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p> <p>P/s: Cảm ơn mọi người!</p>