Cơ bản về RegExp (so mẫu) 2007-07-22 22:16:36

Biểu thức so mẫu (pattern) dùng để mô tả 1 cách tổng quát 1 đối tượng (chuỗi) trong PHP, ví dụ:
preg_replace('/[^a-z0-9]+/i','',$str);
--> hàm này l loại bỏ tất cả các ký tự không phải là chữ (a-z và A-Z) hoặc số (0-9) ra khỏi chuỗi $str

Biểu thức so mẫu dùng rất hiệu quả và nhanh chóng, tuy nhiên theo TG biết thì cũng không nhiều người biết sử dụng cái này(nhất là ở nơi không có trường lớp đào tạo cơ bản về PHP như VN chúng ta) còn số người biết,hiểu rõ thì không training lại nên đã ít nay càng ít người biết sử dụng biểu thức so mẫu. Trong bài này TG chỉ giới thiệu 1 số kiến thức cơ bản và 1 vài ví dụ để dễ hiểu, hy vọng là giúp ít cho anh em.
Cấu trúc: như ví dụ trên thì /[^a-z0-9]+/i là 1 biểu thức so mẫu,
- giới hạn trong cặp dấu /<so mẫu>/x hoặc #<so mẫu>#x
- x có thể là 1 hoặc nhiều ký tự để mô tả dữ liệu được lấy và cũng có thể không có trong biểu thức so mẫu. Một số giá trị có thể có của  x:
+ i: không phân biệt chữ hoa, chữ thường
+ s: bao gồm cả các ký tự xuống dòng
+ Ngoài còn có 1 số giá trị khác như: S,U,... nhưng ít được sử dụng

Ta lấy ví dụ cho dễ hình dung:
preg_replace('/[^a-z0-9]/','','phpBASIC$')
-> php
preg_replace('/[^a-z0-9]/i','','phpBASIC$')
-> phpBASIC
Ý nghĩa của các ký tự trong biểu thức so mẫu:

\ loại bỏ các ký tự đặc biệt của pattern
  /(phpbasic)/ : chuỗi phpbasic
  /\(phpbasic\)/ : chuỗi (phpbasic)


^ ký tự bắt đầu
/^php(.*)/ : những chuỗi bắt đầu bằng chữ php


$ ký tự kết thúc
/(.*)basic$/ : những chuỗi kết thúc bằng chữ basic


. bất kỳ ký tự nào trừ ký tự xuông dòng
/(.*)/ : tất cả các ký tự nằm trên 1 dòng


[] bắt đầu và kết thúc 1 lớp ký tự
/[a-z]/ : tất cả các ký tự a-z
  chú ý trong 1 lớp:
  ^ phủ định:
    /[^a-z]/ : những ký tự không phải là a-z
  -  1 khoảng:
   /[a-d]/ : bao gồm a,b,c,d


| hoặc
/a|b/ : ký tự a hoặc b
( và ) bắt đầu và kết thúc 1 so  mẫu con
/^a(c|d)b/ : chuỗi có dạng acb hoặc acd


? có hoặc không
/ab?c/ : chuỗi có dạng abc hoặc ac


* : 0 hoặc nhiều hơn ký tự
/a*/ : <null>, a, aa, aaa,.............


+ : có ít nhất 1
/a+/ : a,aa,aaa,...............


{} bắt đầu và kết thúc min/max ký tự
/a{1,3}/ :  a,aa,aaa


Các ký tự đặc biệt khác:

\n hoặc \r : ký tự xuông dòng
\t : ký tự tab
\d : bất kỳ ký tự số nào
\D : bất kỳ ký tự nào mà không phải là số
\s : bất kỳ ký tự khoảng trắng
\S : bất kỳ ký không phải là khoảng trắng
\w : bất kỳ từ nào
\W : không phải là từ

Tra loi 19 comment(s) TG 2007-07-22 22:16:36

NguyÅn Minh Tân 2007-07-22 22:46:43

Híc hóa ra là từ trước đến nay em nhầm mấy bác T_T , cứ nghe mấy bác nói biểu thức so mẫu lại cứ tưởng là mấy bác đang nói giải thuật nào , hóa ra là mấy bác đang nói về regular expression T_T

Tra loi

Cutebabydog 2007-07-23 23:01:33

Xau ghe , den bay gio moi chiu training, quen ong lau rui ma ...:((

Tra loi

David Huynh 2007-07-24 10:41:26

1 tool khá hay để viết Regular Expression: RegBuddy (search trên Google sẽ thấy), ai có crack thì gửi cho tui qua phaoloanhkhoa@gmail.com nhé. Thanks !!!

Tra loi

tandaica0612 2007-08-12 09:13:48


Hô hô tự dưng hôm nay nghịch cái smarty xem nó code thế nào thấy có mấy biểu thức regex lạ , đọc lại manual thì hiểu thêm được mấy điều rất hay ^^ :

<?php
$string
= 'tan{2}╝?ndaica0612';
preg_match_all('╝tan\{2\}\╝\?╝',$string,$match);
print_r($match);
?>
<?php
$string
= 'php?basic';
preg_match_all('-php\?-',$string,$match);
print_r($match);
?>
<?php
$string
= 'php?&basic';
preg_match_all('&php\?\&&',$string,$match);
print_r($match);
?>

Bác nào biết regex xem sẽ hiểu thêm được vài điều ^^

Tra loi

TG 2007-08-13 12:41:25

@tandaica0612: ở đây có mấy ký tự lạ xuất hiện trong bài post của tandaica0612, không biết lúc đầu đã vậy hay do cái form của TG hiển thị vậy nhỉ

Tra loi

tandaica0612 2007-08-13 06:47:20

Là do mình làm thế đấy , để kiểm tra cái regex này nó có đúng không , phát hiện ra 1 điều là trong php không nhất thiết so mẫu phải trong cặp ngoặc /<so mẫu>/ hoặc #<so mẫu># mà có thể là bất cứ cái gì (hình như ngoại trừ số , chữ cái thì phải ) ,VD:

╝/⌂╡→P|µ¼¿√╘¼

Tra loi

changtraingheo 2008-01-15 12:46:34

giúp viết biểu thức này giùm cái
"text text <embed ..... </embed> text text "
giờ mình muốn thay nguyên đoạn embed thày một đoạn "Media Player" thì viết sao. Híc đọc đi đọc lại cái này mà ko tài nào hiểu nổi. Chắc do ngu quá T_T

Tra loi

changtraingheo 2008-01-17 12:03:09

mọi người đâu hết rồi

Tra loi

cocbay 2008-01-17 12:39:51

Bạn muốn thay làm sao? Vì thẻ embed trình duyệt cũng hiểu là 1 "Media Player" rồi.

Tra loi

TK 2008-01-17 04:53:19

Giữ nguyên bên trong <embed..</embed> hay thay hết tất cả bên trong

Tra loi

ChonCon 2008-01-18 10:54:48

/\<embed[^>]+>\<\/embed>/i

Tra loi

changtraingheo 2008-01-18 02:45:52

$a = '<center><object classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" height="350" width="400"><br>
<param value="nhac/Into The Night.wmv" name="url"><br>
<embed src="nhac/Into%20The%20Night.wmv" type="application/x-mplayer2" height="350" width="400"><br>
</object></center>';
echo preg_replace('/\<object[^>]+>\<\/object>/i','hehe',$a);

- Như vậy sao ko được ta

Tra loi

ChonCon 2008-01-19 06:28:36

Pó tay thế thì phải nói rõ là không cùng 1 dòng chứ

=> thế này
/<object[^>]*>([\\S\\s]*?)<\/object>/img

Tra loi

changtraingheo 2008-01-20 11:16:03

híc, lại lỗi nữa
echo preg_replace('/<object[^>]*>([\\S\\s]*?)<\/object>/img','hehe',$a);


Warning: preg_replace() [function.preg-replace]: Unknown modifier 'g' in W:\www\newblog\a.php on line 7

Tra loi

jscode.uni.cc 2008-01-21 08:24:22

ah nhầm trong php kô có kiểu so mẫu global bỏ hết chỗ img đi là được

Tra loi

Nguyễn nam Doanh 2008-11-12 05:23:20

Cám ơn bài viết nhe. mình đã tìm suốt rồi mà hôm nay mới thấy

Tra loi

ngocthao 2008-11-21 05:06:39

"preg_replace('/[^a-z0-9]+/i','',$str);
--> hàm này l loại bỏ tất cả các ký tự không phải là chữ (a-z và A-Z) hoặc số (0-9) ra khỏi chuỗi $str"

Câu này dịch sai: Ko phải loại bỏ mà là tìm các ký tự a->z và 0->9 thay thế bằng '_' trong $str.

Tra loi

changtraingheo 2008-11-21 05:13:47

Câu này dịch sai: Ko phải loại bỏ mà là tìm các ký tự a->z và 0->9 thay thế bằng '_' trong $str.

có nhìn nhầm ko vậy .. thay thế bằng "_" zday bạn có nhìn thấy "_" trên biểu mẫu trên không?

Tra loi

yeah22@yahoo.com 2009-01-14 11:13:15


cho em hỏi em muốn lấy 1 địa chỉ email trong chuỗi sau ! nhưng em làm mãi mà ko dc ^^ mong anh chị góp ý
<?php
$str
= "(nho pa ja quYa di a % emday@phpbasic.com";
$str = preg_replace('/[^a-z0-9]+@[^a-z0-9]+\.[^a-z]{2,3}/','',$str);
echo
$str;
?>
em mới học thôi à

Tra loi

Y kien