banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Regular Expression trong Perl PHP và ứng dụng căn bản  XML
  [Question]   Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 15:12:47 (+0700) | #1 | 119305
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]
Chào cả nhà, tự dưng thấy ku quanta nhắc tới Regular Expression mới biết tiếng Anh nó là như thế, không biết tiếng Việt dịch ra sao, nên dùng tạm cụm từ này. Nếu không đúng các bác sửa lại cho em!

1. Regular Expression là gì?
ĐN: Là hệ thống tìm kiếm text fragment trong tài liệu số dựa trên những bản ghi mẫu.
Cái định nghĩa này dịch ra tiếng Việt nên nó ko sạch sẽ lắm, FaL sẽ cố gắng làm rõ hơn.
Để viết regular expression ta cần làm quen với những ký tự có ý nghĩa đặc biệt trong một regular expression - Meta symbols. Những ký tự được liệt kê dưới đây theo format: ký tự - ý nghĩa

^ - Bắt đầu dòng(string)
$ - Kết thúc dòng
. - Đại diện cho một ký tự bất kỳ
+ - Lặp với số lượng >= 1
* - Lặp với số lượng bất kỳ (>=0)
? - Tồn tại hoặc không tồn tại
\ - Dấu / đi kèm với 1 meta symbol sẽ làm mất ý nghĩa của meta symbol đó - trả về symbol bình thường.

Ví dụ với những expression sau sẽ có ý nghĩa:

^a - Bắt đầu của dòng là ký tự a. Dòng này có thể là abcd, aaaa, a4684,.... miến sao bắt đầu bằng ký tự a.
^string$ - Dòng này mang giá trị cứng là string vì nó bị chặn giữa ^ và $
a. - có thể mang giá trị: ab, a1, au, af - nhưng không thể là abc, ab1, vì dấu . chi đại diện cho 1 ký tự!
ax+ - biểu diễn cho dòng: ax, axxxx, axxxx - nhưng không thể là "a" vì + đại diện cho >=1 ký tự.
ay* - biểu diễn cho dòng: a, ay, ayy, ayyyyyyyyy,....
ab? - biểu diễn cho: a, ab (b có thể có hoặc không)
a\+b - biểu diễn cho dòng: "a+b"

Làm quen tiếp với một số cách biểu diễn khác:
\d - Chữ số bất kỳ
\D - Ký tự bất kỳ không phải là chữ số (ngược với \d)
\w - Ký tự từ a-z, A-Z, hoặc 0-9
\W - Ngược lại với \w (nghĩa là các ký tự không thuộc các khoảng: a-z, A-Z, hoặc 0-9)
\s - Khoảng trắng (space)
\S - Ký tự bất kỳ không phải là khoảng trắng.

Thêm một số ví dụ:
\s+ - Có nghĩa: có >=1 khoảng trắng.
^\d+ - Bắt đầu là chữ số, và theo sau nó là một số chữ số chưa xác định

Có vẻ hơi khó hiểu thiệt, tui viết xong đọc lại thấy cũng ... mờ mờ smilie.

2. Tìm kiếm từ với Perl, PHP:

Trước hết ta làm quen với cách tìm chuỗi con trong câu:
Perl:
Syntax: ~/<nội dung>/
$s = "One Two Three"
Để xác định trong câu này có chuỗi "Two" hay không, ta dùng biểu thức:
Code:
$s=~/Two/;

Đẳng thức này sẽ trả về 1 nếu trong $s chứa "Two".

PHP:
Hàm: preg_match('/<nội dung>/',$s) - với <nội dung là chuỗi con cần tìm trong $s. Tương tự như Perl, preg_match sẽ trả về 1 nếu $s có chứa ><nội dung>, ngược lại sẽ trả về 0.
Code:
preg_match('/Two/', $s);

Ghi chú: Phân biệt chữ HOA và chữ thường trong lúc tìm kiếm. Để bỏ phân biệt chữ hoa và chữ thường, ta thêm i vào cuối <nội dung>:
Code:
$s=~/two/i;

---> trả về 1;
Code:
preg_match('/tWo/i', $s);

---> trả về 1;

3. Áp dụng Regular Expression vào tìm kiếm + tách từ:

Cũng với câu $s = "One Two Three", ta tách thành 3 từ "One", "Two", "Three" đơn giản như sau:
Perl:
Code:
$s=~/^(\w+)\s+(\w+)\s+(\w+)$/;

Sau lệnh này Perl sẽ trả giá trị vào 3 biến mặc định có tên $1, $2, $3 - cụ thể: $1 = "One", $2 = "Two", $3 = "Three".

Giải thích cho câu lệnh trên: $s=~/^(\w+)\s+(\w+)\s+(\w+)$/
. Ở đây chúng ta có 3 cặp dấu () - 3 cặp dấu này sẽ thông báo cho Perl biết là ta đang tìm 3 từ trong câu. (Bao nhiêu cặp dấu ứng với bấy nhiêu từ). Trong mỗi cặp dấu ta sẽ dùng Regular Expression để định nghĩa từ muốn tìm, cụ thể đơn giản ở đây chỉ là \w+ nghĩa là từ này bao gồm một số (>=1) ký tự nhất định (những ký tự này thuộc a-z, A-Z, 0-9). Giữa các từ là \s+ mang ý nghĩa: "Có một số khoảng trắng ở giữa các từ".

Với định nghĩa như trên thì nếu:
Code:
$s="One               Two    Three"

thì
Code:
$s=~/^(\w+)\s+(\w+)\s+(\w+)$/;

vẫn trả về 3 biến Code:
$1 = "One", $2 = "Two", $3 = "Three"


(Vì ta chỉ lấy từ ở trong dấu ngoặc (), những khoảng trắng giữa chúng được bỏ đi)

PHP:
Thủ tục:
Code:
preg_match('/^(\w+)\s+(\w+)\s+(\w+)$/', $s, $a);


sẽ trả về kết quả 3 từ vào mảng a. Ở đây Regular Expression hoàn toàn giống như với Perl, chỉ khác là thêm $a, để xuất giá trị ra. Kết quả thu được:
Code:
$a[1]="One"
$a[2]="Two"
$a[3]="Three"


Làm việc với string thường rất vất vả và đòi hỏi độ chính xác cao. với Regular Expression trong Perl, PHP, công việc này được đơn giản đi rất nhiều. 1 dòng code trong Perl, PHP làm việc với string trong trường hợp này có thể sánh với hàng trang code trong các ngôn ngữ khác.

Ta có thể ứng dụng những đoạn code đơn giản ở trên vào các form đòi hỏi nhập dữ liệu, thông tin người dùng, ... hay dùng để lọc các biến được truyền.
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 23:02:29 (+0700) | #2 | 119321
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Có 1 cái link khá hay về RE: http://swtch.com/~rsc/regexp/regexp1.html
Hồi trước rất thích xài RE, nhưng từ khi đọc cái link trên thì rất ngại dùng.
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 23:11:27 (+0700) | #3 | 119325
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

SuperChicken wrote:
Có 1 cái link khá hay về RE: http://swtch.com/~rsc/regexp/regexp1.html
Hồi trước rất thích xài RE, nhưng từ khi đọc cái link trên thì rất ngại dùng.
 


Không nên ngại dùng regex smilie. Nó được dùng khắp nơi và nó là một thứ tiện ích không thể thiếu được trong lập trình.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 23:16:25 (+0700) | #4 | 119326
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Hix, anh conmale nói vậy nghe cũng mừng, nhưng còn cái vấn đề về giải thuật dùng để implement cái RE parser trong các ngôn ngữ thịnh hành bây giờ như thế nào? Em thấy trong đó nó nói nghe ghê quá: "Notice that Perl requires over sixty seconds to match a 29-character string."
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 23:21:08 (+0700) | #5 | 119327
[Avatar]
tien_nt
Member

[Minus]    0    [Plus]
Joined: 21/09/2007 15:44:47
Messages: 36
Offline
[Profile] [PM]
Thanks Fal!
Bài viết rất hay và bổ ích cho những người đang trau dồi kiến thức lập trình. Theo mình thấy room này vẫn còn thiếu những bài viết như thế này. Mong các mod và vmod cống hiến hơn nữa cho các thành viên trong forum HVA nói chung và room này nói riêng. Thanks
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 23:28:52 (+0700) | #6 | 119328
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

SuperChicken wrote:
Hix, anh conmale nói vậy nghe cũng mừng, nhưng còn cái vấn đề về giải thuật dùng để implement cái RE parser trong các ngôn ngữ thịnh hành bây giờ như thế nào? Em thấy trong đó nó nói nghe ghê quá: "Notice that Perl requires over sixty seconds to match a 29-character string." 


Anh nghĩ đây là một "indicative" mà thôi. Hiệu suất còn tùy thuộc vào nhiều thứ khác nữa. Đối với RE trong môi trường ứng dụng thật sự, nên dùng nó một cách hợp lý và cẩn thận thay vì bạ đâu, dùng đấy. RE thường dùng để match những input string không quá dài nhưng lại quan trọng, ví dụ như username, các hidden field values.... Việc construct một matching pattern cũng đóng vai trò quan trọng cho việc gia tăng hiệu suất matching nữa.

Thân.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 14/03/2008 23:31:42 (+0700) | #7 | 119330
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Xin phép "đi" ngoài lề topic tí:

tien_nt wrote:

...
Theo mình thấy room này vẫn còn thiếu những bài viết như thế này. Mong các mod và vmod cống hiến hơn nữa cho các thành viên trong forum HVA nói chung và room này nói riêng. Thanks 

Tất cả mọi người cùng đóng góp thì cái forum nó mới lớn mạnh được chứ. Mong rằng mọi người sẽ chăm chỉ viết bài hơn.

SuperChicken wrote:
Có 1 cái link khá hay về RE: http://swtch.com/~rsc/regexp/regexp1.html
Hồi trước rất thích xài RE, nhưng từ khi đọc cái link trên thì rất ngại dùng.
 

--> Tớ thấy nó hay được viết tắt là regex hoặc regexp hơn, viết RE người ta lại hiểu nhầm là Reverse Engineering
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 15/03/2008 01:09:19 (+0700) | #8 | 119339
[Avatar]
canh_nguyen
Elite Member

[Minus]    0    [Plus]
Joined: 23/08/2004 18:55:09
Messages: 775
Location: Broken dream
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

SuperChicken wrote:
Có 1 cái link khá hay về RE: http://swtch.com/~rsc/regexp/regexp1.html
Hồi trước rất thích xài RE, nhưng từ khi đọc cái link trên thì rất ngại dùng.
 


Trường hợp chỉ check string trong string nào đó thì dùng strpos() hoặc strstr() sẽ nhanh hơn smilie
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 15/03/2008 02:42:04 (+0700) | #9 | 119358
nbthanh
HVA Friend

Joined: 21/12/2001 14:51:51
Messages: 429
Offline
[Profile] [PM]
Fal tham khảo thêm link này:
http://www.diendantinhoc.net/tute/laptrinh/perl/learningperl/ch_07.html
Và các link về RE trong PHP (lưu ý, PHP hỗ trợ 2 loại syntax/lib regexp khác nhau!)
để làm tài liệu tham khảo cho các phần sau của bài viết smilie
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 15/03/2008 02:54:52 (+0700) | #10 | 119360
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

nbthanh wrote:
Fal tham khảo thêm link này:
http://www.diendantinhoc.net/tute/laptrinh/perl/learningperl/ch_07.html
Và các link về RE trong PHP (lưu ý, PHP hỗ trợ 2 loại syntax/lib regexp khác nhau!) 


smilie So với tut này thì bài của em chỉ là ... con tép :p. Hì, hay thiệt! Hiếm khi em đọc tài liệu tiếng Việt (dịch sang tiếng Việt) thấy rành mạch như vậy.

nbthanh wrote:
để làm tài liệu tham khảo cho các phần sau của bài viết  


Có link này rồi viết tiếp chi nữa anh :p
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 16/03/2008 01:00:49 (+0700) | #11 | 119519
pnco
HVA Friend

Joined: 24/06/2005 16:33:48
Messages: 515
Offline
[Profile] [PM] [WWW]
Không nên nản sớm thế em. Ráng đi biết đâu mai mốt bác nbthanh lại lấy link bên đây đưa sang diendantinhoc smilie
[Up] [Print Copy]
  [Question]   Re: Regular Expression trong Perl PHP và ứng dụng căn bản 16/03/2008 01:36:01 (+0700) | #12 | 119521
minhhuy001122
Member

[Minus]    0    [Plus]
Joined: 29/09/2007 16:04:32
Messages: 14
Offline
[Profile] [PM]
Em ko nhiều kinh nghiệm nhưng em thấy rằng có những trường hợp ko dùng RE khó mà giải quyết được vấn đề.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|