[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
|
|
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ờ .
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:
Đẳ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:
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:
---> 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:
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 |
|
|
|
[Question] Re: Regular Expression trong Perl PHP và ứng dụng căn bản |
14/03/2008 23:02:29 (+0700) | #2 | 119321 |
|
SuperChicken
Elite Member
|
0 |
|
|
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
|
|
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.
|
|
|
|