tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu biểu thức chính quy, thư viện chính quy trong NN Java, PHP.net

15 823 1
tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu biểu thức chính quy, thư viện chính quy trong NN Java, PHP.net

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

I TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG    BÀI TẬP LỚN NGUYÊN LÝ CÁC NGÔN NGỮ LẬP TRÌNH Giáo viên hướng dẫn: TS Nguyễn Hữu Đức Học viên thực : Trương Thảo Nguyên CB120098 Vũ Đình Phú CB120104 Nguyễn Thị Thùy Liên CB120046 Lớp: Công nghệ thông tin (KT) Chuyên ngành: Công nghệ thông tin (KT) Đề bài: Biể u thức quy, thư việ n biể u thức quy ngôn ngữ lập trình Java, PHP, NET HÀ NỘI 11 – 2012 MỤC LỤC Biểu thức quy 1.1 Khái niệm 1.2 Đặc điểm 1.2.1 Ưu điểm 1.2.2 Nhược điểm .4 1.3 Lịch sử phát triển 1.4 Các kiến thức biểu thức quy 1.4.1 Cách thức họat động biểu thức quy 1.4.2 Kí tự thông thường kí tự đặc biệt 1.4.2.1 Kí tự thông thường 1.4.2.2 Kí tự đặc biệt 1.4.3 Tìm kiếm theo vị trí 1.4.3.1 Neo đầu neo cuối chuỗi 1.4.3.2 Sử dụng ^ $ để neo đầu cuối dòng 1.4.3.3 Neo đầu cuối chuỗi vĩnh cửu 1.4.4 Các lớp ký tự .8 1.4.4.1 Lớp ký tự phủ định 1.4.4.2 Metacharacter lớp ký tự .9 1.4.4.3 Lớp ký tự viết tắt (Shorthand Character Classes) 10 1.4.4.4 Lớp ký tự viết tắt phủ định (Negated Shorthand Character Classes) 10 1.4.5 Biểu thức lặp theo độ dài 10 1.4.6 Phân nhóm 11 Thư viện biểu thức quy ngôn ngữ lập trình PHP 11 2.1 Thư viện PCRE l(Perl-Compatible Regular Expressions) 11 2.2 Các nhóm hàm regular expression PHP 12 2.2.1 Tập hàm preg 12 2.2.1.1 Hàm preg_match 12 2.2.1.2 Hàm preg_match_all 12 2.2.1.3 Hàm preg_grep 13 2.2.1.4 Hàm preg_repalce 13 2.2.1.5 Hàm preg_ repalce _callback 13 2.2.1.6 Hàm preg_split 13 2.2.2 Tập hàm ereg 14 2.2.2.1 Hàm ereg 14 2.2.2.2 Hàm ereg_replace 14 2.2.2.3 Hàm split 14 2.2.3 Tập hàm mb_ereg 14 Tài liệu tham khảo 15 Biểu thức quy 1.1 Khái niệm Biểu thức quy ( regular expression viết tắt regexp, reges hay regxp) chuỗi miêu tả chuỗi khác, theo quy tắc cú pháp định 1.2 Đặc điểm 1.2.1 Ưu điểm  Giúp đơn giản lập trình trình xử lý văn ( Thay cần đến hàng trăm thủ tục để trích xuất tất địa email từ số tài liệu, với regular expression cần số dòng lệnh chí dòng lệnh để làm việc  Giúp tiết kiệm thời gian công sức 1.2.2 Nhược điểm  Gây phiền toái không mong muốn như: sử dụng biểu thức quy không phù hợp với biểu thức muốn tìm số văn tìm với biểu thức quy không phù hợp 1.3 Lịch sử phát triển Nguồn gốc biểu thức quy nằm lý thuyết tự động lý thuyết ngôn ngữ hình thức, hai phần khoa học máy tính Do nói thuật ngữ regular expression xuất phát từ lý thuyết toán học khoa học máy tính, phản ánh đặc điểm biểu thức toán học gọi quy (regularity) Trong năm 1950, nhà toán học Stephen Cole Kleene mô tả mô hình cách sử dụng ký hiệu toán học ông gọi tập quy Ngôn ngữ SNOBOL sử dụng việc so khớp mẫu, không giống hoàn toàn với biểu thức quy Sau Ken Thompson xây dựng ký hiệu Kleene vào trình soạn thảo QED để so khớp mẫu file văn Sau ông thêm khả vào trình soạn thảo Unix, mà cuối trở thành công cụ tìm kiếm grep phổ biển sử dụng cho biểu thức quy (grep từ có nguồn gốc từ lệnh biểu thức quy tìm kiếm: g/re/p viết tăt cho biểu thức quy) Kể từ nhiều biến thể biểu thức quy Thompson đưa sử dụng rộng rãi Unix hệ Unix-like bao gồm expr, AWK, Emacs Biểu thức quy Perl Tcl bắt nguồn từ thư viện regex viết Henry Spencer, sau Perl mở rộng thư viện để thêm nhiều tính Philip Hazel phát triển PCRE(Perl Compatible Regular Expressions – biểu thức quy tương thích Perl), dựa biểu thức quy Perl sử dụng nhiều công cụ đại PHP Apache HTTP Server Một phần nổ lực việc thiết kế Perl6 cải thiện, phát triển biểu thức quy Perl tích hợp tăng phạm vi khả phép định nghĩa biểu phân tích cú pháp Kết cho đời mini-language gọi Perl sử dụng để định nghĩa cú pháp cung cấp mọt công cụ để lập trình ngôn ngữ 1.4 Các kiến thức biểu thức quy 1.4.1 Cách thức họat động biểu thức quy Regex engine phận phần mềm, chuyên để xử lý regex (so khớp mẫu với chuỗi đó) Có nhiều regex engine chúng không hoàn toàn tương thích với Cú pháp regex (flavor) engine có khác Chúng ta tập trung vào cú pháp regex sử dụng Perl 5, phổ biến Rất nhiều engine regex khác giống với engine sử dụng Perl 5: engine nguồn mở PCRE (sử dụng nhiều ngôn ngữ lập trình, PHP), thư viện regex NET, Hiểu cách làm việc regex engine giúp ta viết regex tốt hơn, dễ dàng Nó giúp ta hiểu regex hoạt động không mong muốn, giúp tiết kiệm thời gian phải mò mẫm viết regex phức tạp Có loại regex engine: text-directed engines, regex-directed engines Loại cú pháp regex mà ta thảo luận thuộc loại regex-directed engines Loại engine phổ biến có số chức hữu dụng như: lazy quantifiers, backreferences, Có thể dễ dàng kiểm tra xem loại cú pháp sử dụng thuộc engine qua việc kiểm tra xem lazy quantifiers backreferences có hỗ trợ không Hãy thử dùng biểu thức regex regex|regex not vào chuỗi regex not xem Nếu kết so khớp regex, engine dùng thuộc loại regex-directed Nêu kết regex not, engine thuộc loại text-directed Trong VD tiếp theo, ta phân tích cụ thể cách thức làm việc regex engine, qua giúp sử dụng regex hiệu tránh mắc lỗi Regex-directed engine trả kết so khớp bên trái Thậm chí match tốt tìm thấy tiếp tục so khớp Đây điều cần ghi nhớ Regex-directed engine bắt đầu so khớp với ký tự chuỗi Hãy lấy VD đơn giản để minh hoạ: ta dùng regex cat vào chuỗi He captured a catfish for his cat Engine bắt đầu so khớp dấu regex c với ký tự chuỗi H Không khớp Vì tiếp tục so khớp với ký tự thứ e space Đều không khớp Đến ký tự thứ 4, c khớp với c Xong, engine bắt đầu so khớp dấu hiệu thứ regex a với ký tự thứ chuỗi a Khớp Nhưng đến dấu hiệu thứ regex t không khớp với ký tự thứ chuỗi p Lúc engine ngộ tìm match ký tự thứ chuỗi Vì vậy, bắt đầu lại công việc từ đầu, từ ký tự thứ chuỗi Regex c không khớp với a Cứ tiếp tục ký tự thứ 15 chuỗi, regex c khớp với c Engine so khớp dấu hiệu lại regex với ký tự chuỗi: a khớp a, t khớp t Và match tìm thấy ký tự 15 Engine trả kết ngừng luôn, không tiếp tục tìm xem match tốt không (VD: cat cuối chuỗi) 1.4.2 Kí tự thông thường kí tự đặc biệt 1.4.2.1 Kí tự thông thường Regex biểu thức bao gồm ký tự thông thường, VD: a Nó so khớp với thực thể ký tự chuỗi VD có chuỗi: LazyDog is a boy, so khớp với ký tự a sau ký tự L Regex so khớp với ký tự a thứ ta điều khiển regex engine tiếp tục tìm kiếm sau so khớp lần Cũng vậy, regex dog so khớp với dog chuỗi LazyDog is not a dog Regex bao gồm sêri ký tự thông thường Engine hiểu biểu thức là: tìm d, theo sau o, theo sau g Chú ý regex engine mặc định phân biệt chữ hoa chữ thường Dog không so khớp với dog 1.4.2.2 Kí tự đặc biệt Vì ta cần làm nhiều công việc phức tạp tìm kiếm đoạn văn bản, phải trưng dụng vài ký tự để làm nhiệm vụ đặc biệt Trong cú pháp regex thảo luận đây, có 11 ký tự mang ý nghĩa đặc biệt: [ \ ^ $ | ? * + ( ) Chúng gọi metacharacter Nếu cần dùng ký tự với ý nghĩa thông thường, ta phải giải phóng \ VD cần so khớp 1+1=2, regex 1\+1=2 Chú ý 1+1=2 regex đúng, nên không báo lỗi, không cho ta kết mong muốn Regex 1+1=2 so khớp với 111=2 chuỗi 123+111=234, dấu + mang ý nghĩa đặc biệt Nếu ta quên không giải phóng ký tự đặc biệt chỗ không phép đứng gặp lỗi VD: +1 Hầu hết loại cú pháp regex coi { ký tự thông thường, trừ phần toán tử nhắc lại (repetition operator), VD: {1, 3} Vì ta không cần giải phóng ký tự Ta dùng \ để giải phóng ký tự đặc biệt, ký tự khác không nên, \ ký tự đặc biệt \ kết hợp với ký tự thông thường có ý nghĩa đặc biệt, VD: \d so khớp với chữ số từ - Tất loại cú pháp regex cho phép giải phóng ký tự đặc biệt \ Rất nhiều cú pháp khác hỗ trợ kiểu giải phóng \Q \E Tất ký tự nằm cặp \Q \E coi ký tự thông thường VD: \Q*\d+*\E so khớp với đoạn văn *\d+* Kiểu cú pháp hỗ trợ JGsoft engine, Perl, PCRE 1.4.3 Tìm kiếm theo vị trí 1.4.3.1 Neo đầu neo cuối chuỗi Mỏ neo không so khớp với ký tự Thay vào đó, chúng so khớp với vị trí trước, sau ký tự Chúng sử dụng để "neo" biểu thức regex vào vị trí để so khớp Dấu ^ khớp với vị trí trước ký tự chuỗi Áp dụng regex ^a cho chuỗi abc, ta a ^b kết so khớp với abc, b không khớp với ký tự sau vị trí bắt đầu chuỗi, vị trí khớp ^ Tương tự trên, $ khớp với vị trí sau ký tự cuối chuỗi c$ khớp với c abc, a$ không khớp Khi sử dụng regex ngôn ngữ lập trình để kiểm định thông tin nhập vào từ người dùng, sử dụng neo quan trọng VD ta dùng \d+ để kiểm tra xem người dùng có nhập vào số nguyên hay không, kết trả chí người dùng nhập qsdf4ghjk, \d+ khớp với Regex phải ^\d+$ Bởi vị trí đầu chuỗi phải khớp trước \d+ khớp, vị trí cuối chuỗi phải khớp sau đó, chuỗi nhập vào muốn khớp với ^\d+$ chuỗi chữ số (dấu + toán tử nhắc lại, dùng để nhắc lại ký tự trước nhiều lần) Một ý khác ta dễ dàng mắc lỗi với ký tự trắng Trong ngôn ngữ Perl chẳng hạn, đọc vào dòng từ file text, ký tự line break lưu vào biến Do trước tiến hành kiểm định thông tin nhập vào, ta cần chặt bỏ ký tự trắng đầu cuối ^\s+ khớp với ký tự trắng đầu \s+$ khớp với ký tự trắng cuối 1.4.3.2 Sử dụng ^ $ để neo đầu cuối dòng Nếu chuỗi cần xử lý viết nhiều dòng, kiểu first line\nsecond line (\n ký tự line break), ta muốn làm việc với dòng với chuỗi Do đó, regex engine thảo luận loạt có thêm chức mở rộng ý nghĩa mỏ neo ^ vừa khớp với vị trí đầu chuỗi (trước ký tự f VD trên), vừa khớp với vị trí sau line break (giữa \n s) Cũng vậy, $ vừa khớp với vị trí cuối chuỗi (sau ký tự e cuối cùng), vừa khớp với vị trí trước line break (giữa e \n) Trong ngôn ngữ lập trình, ta phải kích hoạt chức mở rộng này, gọi chế độ đa dòng (multi-line mode) VD Perl, ta làm việc cách thêm m vào sau đoạn mã regex, VD: m/^regex$/m; 1.4.3.3 Neo đầu cuối chuỗi vĩnh cửu \A khớp với vị trí đầu chuỗi, \Z khớp với vị trí cuối chuỗi Chúng không khớp vị trí line break, chí chế độ "multiline mode" kích hoạt Điều cho tất loại cú pháp regex thảo luận 1.4.4 Các lớp ký tự Sử dụng lớp ký tự, ta khiến regex engine chọn ký tự để so khớp Để sử dụng, ta đặt ký tự cần so khớp vào dấu [ ] VD: để so khớp ký tự a e, ta dùng [ae] Như biểu thức gr[ae]y khớp với gray grey Lớp ký tự so khớp với ký tự đơn Như gr[ae]y không khớp với graay, graey,v.v Thứ tự ký tự lớp không quan trọng Kết trả giống Để xác định vùng ký tự lớp ký tự, ta sử dụng dấu - VD: [0-9] so khớp với chữ số từ - Có thể sử dụng nhiều vùng ký tự kết hợp vùng ký tự với ký tự đơn VD: [0-9a-fAF] so khớp với chữ số hệ 16, không phân biệt chữ hoa, thường [0-9a-fxA-FX] so khớp với chữ số hệ 16 chữ X, không phân biệt chữ hoa, thường Cũng trên, thứ tự vùng không quan trọng 1.4.4.1 Lớp ký tự phủ định Đặt dấu ^ sau [ lớp ký tự phủ định lớp ký tự Kết lớp ký tự so khớp với ký tự không nằm lớp ký tự Lớp ký tự phủ định so khớp với ký tự line break Chú ý lớp ký tự phủ định phải so khớp với ký tự VD: q[^u] "q không theo sau u" mà "q theo sau ký tự u" Vì không so khớp với q chuỗi Iraq, so khớp với q space chuỗi Iraq is a country 1.4.4.2 Metacharacter lớp ký tự Trong lớp ký tự, ký tự mang ý nghĩa đặc biệt hay metacharacter bao gồm: ] \ ^ - Các metacharacter nói phần trước đặt lớp ký tự coi ký tự thông thường, không cần phải giải phóng VD: để tìm ký tự * +, ta dùng [+*] Để đặt ký tự \ vào lớp ký tự với nghĩa thông thường, cần giải phóng ký tự \ khác VD: [\\x] khơp với ký tự \ x Các ký tự ] ^ - muốn dùng theo nghĩa thông thường phải giải phóng \ đặt vị trí mà ý nghĩa đặc biệt Ta nên dùng cách thứ để biểu thức regex trông dễ nhìn sau: Với ^, đặt chỗ trừ vị trí sau [ VD: [x^] khớp với x ^ Với ], đặt sau [ [^ VD: []x] khớp với ] x [^]x] khớp với ký tự ] x Với -, đặt sau [ [^ , trước ] VD: [-x] [x-] so khớp với x Có thể sử dụng tất ký tự không in lớp ký tự giống dùng chúng lớp ký tự VD: [$\u20AC] khớp với $ ký tự đồng euro (với giả định cú pháp regex dùng hỗ trợ unicode) JGsoft engine, Perl PCRE hỗ trợ kiểu \Q \E lớp ký tự để giải phóng chuỗi ký tự VD: [\Q[-]\E] khớp với [ - ] Cú pháp regex POSIX lại xử lý \ lớp ký tự ký tự thông thường Đồng nghĩa với việc ta dùng \ để giải phóng ] ^ - Để làm việc ta cách đặt chúng vào vị trí trình bày Ngoài điều đồng nghĩa với việc cú pháp tắt (shorthand, VD: \d) không hiệu lực 1.4.4.3 Lớp ký tự viết tắt (Shorthand Character Classes) \d dạng tắt [0-9] \w gọi "ký tự từ" (word character) Chính xác ký tự khớp với thay đổi tuỳ theo loại cú pháp regex Trong tất loại cú pháp, bao gồm [A-Za-z] Trong hầu hết loại cú pháp, bao gồm dấu _ chữ số \s gọi "ký tự trắng" (whitespace character) Nó khớp với ký tự tùy thuộc vào loại cú pháp Trong kiểu cú pháp thảo luận đây, bao gồm [\t] Nghĩa \s khớp với space tab Trong hầu hết cú pháp , bao gồm ký tự carriage return line feed, nghĩa [\t\r\n] Một số cú pháp khác lại bao gồm thêm ký tự không in dùng vertical tab form feed Các lớp ký tự viết tắt dùng lẫn cặp [] VD: \s\d khớp với ký tự trắng theo sau chữ số [\s\d] khớp với ký tự đơn ký tự trắng chữ số Khi áp dụng vào chuỗi + = 3, regex thứ khớp với (space 2), regex thứ khớp với [\da-fA-F] khớp với chữ số hệ 16, giống [0-9a-fA-F] 1.4.4.4 Lớp ký tự viết tắt phủ định (Negated Shorthand Character Classes) \D tương đương [^\d] \W tương đương [^\w] \S tương đương [^\s] 1.4.5 Biểu thức lặp theo độ dài Biểu thức quy sử dụng ký hiệu + * ? để thể việc lặp ký tự theo độ dài - Ký tự * : mang ý nghĩa lặp lại ký tự, nhóm ký tự trước từ đến n lần - Ký tự + : mang ý nghĩa lặp lại ký tự, nhóm ký tựn trước từ đến n lần - Ký tự ? : mang ý nghĩa lặp lại ký tự, nhóm ký tự trước lần - Ngoài biểu thức quy cho phép quy định biểu thức lặp lại xác số lần - {x}: Mang ý nghĩa lặp lại ký tự, nhóm ký tự trước x lần - {x,y}: Mang ý nghĩa lặp lại ký tự, nhóm ký tự trước từ x đến y lần - {x,}: Mang ý nghĩa lặp lại ký tự, nhóm ký tự trước lớn x lần 1.4.6 Phân nhóm Biểu thức quy sử dụng ký tự mở ngoặc tròn ( đóng ngoặc tròn ) để phân nhóm ký tự Ví dụ /([a-z0-9]+)@([a-z]+)/ : biểu diễn biểu thức quy so khớp với chuỗi ký tự gồm ký tự từ a đến z từ đến nhóm đứng liền lặp lại lần theo sau ký tự @ nhóm ký tự từ a đến z lặp lại lần Thư viện biểu thức quy ngôn ngữ lập trình PHP 2.1 Thư viện PCRE l(Perl-Compatible Regular Expressions) PCRE viết tắt cho Perl-Compatible Regular Expressions Đây tên thư viện mã nguồn mở viết ngôn ngữ C Phillip Hazel Thư viện tương thích với hầu hết trình biên dịch C hệ điều hành Nhiều người phát triển thưc viện từ PCRE làm cho tương thích với ngôn ngữ lập trình khác Ví dụ số Delphi component đơn giản hàm bao quanh thư viện PCRE biên dịch thành thư việ Win32 DLL Thư viện bao gồm nhiều phiên Linux chia sẻ thư viện so file h Các hàm preg PHP lớp REALbasic Regex xây dựng dựa PCRE PCRE thực gần cú pháp biểu thức quy Perl 5.8, có hỗ trợ thuộc tính Unicode với \p không đầy đủ hầu hết phần quan trọng hỗ trợ Sử dụng PCRE đơn giản Trước sử dụng biểu thức quy cần chuyển đổi sang định dạng nhị phân để cải thiện hiệu Để làm điều cần phải gọi hàm pcre_complie() Hàm trả trỏ đến định dạng nhị phân Bạn làm điều với kết ngoại trừ việc sử dụng để thực hàm pcre khác Để sử dụng biểu thức quy, hàm pcre_exec() sử dụng trỏ trả với hàm pcre_complie(), mảng ký tự mà bạn muốn tìm kiếm số ký tự tỏng mảng Bạn cần phải sử dụng trỏ để xác định mảng số nguyên nơi mà hàm pcre_exec() lưu trữ kết quả, chiều dài mảng số nguyên Chiều dài mảng phải số lượng nhóm mà bạn muốn hỗ trợ cộng thêm sau nhân Hàm trả -1 không tìm thấy kết quả, ngược lại trả số lượng nhóm thỏa mãn cộng với Nếu số lượng thỏa mãn nhiều kích thước mảng kết trả Hai số nguyên mảng chứa vị trí bắt đầu biểu thức tìm thấy số byte biểu thức tìm thấy Các cặp số nghuyên chứa vị trí bắt đầu chiều dài tham chiếu ngược Vì array[n*2] vị trí bắt đầu chuỗi thỏa mãn biểu thức quy array[n*2+1] độ dài tương ứng chuỗi Thư viện PCRE hỗ trợ regex phù hợp, công việc làm tốt không cung cấp, hỗ trợ cho việc tìm kiếm thay hay chia tách chuỗi….Tuy nhiên vấn đề lớn bạn dễ dàng làm điều qua việc viết code 2.2 Các nhóm hàm regular expression PHP 2.2.1 Tập hàm preg Tất hàm preg yêu cầu bạn phải đặc tả biểu thức quy chuỗi sử dụng cú pháp Perl Trong Perl, /regex/ định nghĩa biểu thức quy Trong PHP, trở thành preg_match(‘/regex/’,$subject) Dấu ‘/’ để nhận biết biểu thức quy, biểu thức quy cần có dấu ‘/’ phải thêm ‘\’ đằng trước Ví dụ: http://dantri.com.vn -> biểu thức quy phải viết là: ‘/http:\/\/dantri.com.vn/’ Không giống C# hay Java, PHP không yêu cầu loại bỏ toàn ‘\’ chuỗi biểu thức Nếu muốn thêm dấu ‘\’ ký tự xâu PHP, bạn cần loại bỏ nó theo sau ký tự khác, mà cần loại bỏ Trong xâu bao bọc dấu nháy đơn, ký tự nháy đơn ‘\’ cần loại bỏ Dó lý biểu thức quy đây, không cần phải dùng ‘\\’ để nhận biết dấu chấm (.) Để xác định chuỗi ‘\\’ php biểu thức quy phải viết ‘/\\\\/’ Một vài option biểu thức quy: /regix/x - x=i ->Không phân biệt chữ hoa, chữ thường - x=s -> lấy tất ký tự - Ngoài số giá trị khác u,m,x sử dụng 2.2.1.1 Hàm preg_match bool preg_match(string pattern, string subject [, array groups]) Hàm return true biểu thức quy pattern matches với chuỗi subject Mảng groups dùng để lưu lại chuỗi tìm thấy 2.2.1.2 Hàm preg_match_all Int pareg_match_all(string pattern, string subject, array matches, int flags) Hàm lấ y toàn chuỗ i với biể u thức quy củ a chuố i subject Tấ t chuỗ i tìm thấ y lưu mảng matches sắ p xế p nế u truyề n thêm biế n flag 2.2.1.3 Hàm preg_grep Array preg_grep (string pattern, array subjects) Hàm trả mả ng chứa tấ t string mả ng subjects mà tìm thấ y, so khớp với biể u thức quy pattern 2.2.1.4 Hàm preg_repalce Mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit]) Hàm trả string với tất chuỗi tìm thấy, so khớp với biểu thức quy pattern thay bới chuỗi replacement 2.2.1.5 Hàm preg_ repalce _callback preg_replace_callback (mixed pattern, callback replacement,mixed subject[,int limit]) Hàm hoạt động giống hàm preg_replace khác tham số thứ Hàm preg_regplace thay đoạn ký tự so khớp với pattern replacement hàm preg_replace_callback thay thay chuỗi replacement so khớp chuỗi ký tự thỏa mãn pattern gọi hàm callback repacement Hàm callback gọi biểu thức quy so khớp đúng, tham số hàm callback mảng hoạc chuỗi Callbacks cho phép bạn làm tìm kiếm mạnh mẽ thay hoạt động mà bạn làm với biểu thức thông thường Ví dụ: bạn tìm kiếm cho regex(\ d +) \ + (\ d +), bạn thay +3 với cách sử dụng Callback: function regexadd($groups) { return $groups[1] + $groups[2]; } 2.2.1.6 Hàm preg_split Array preg_split (string pattern, string subject [, int limit]) Hàm thực việc phân chia chuỗi subject thành chuỗi thỏa mãn so khớp với patterm trả mảng chuỗi phân tách 2.2.2 Tập hàm ereg Các hàm ereg yêu cầu bạn xác định biểu thức quy chuỗi, bạn mong muốn ereg ('regex', "subject") kiểm tra regex phù hợp với subject Bạn nên sử dụng dấu nháy đơn viết biểu thức quy chuỗi ký tự Một số ký tự đặc biệt dấu $ dấu gạch chéo ngược \ ký tự đặc biệt chuỗi PHP, chuỗi trích dẫn PHP Các hàm ereg không hỗ trợ phiên sau PHP 5.3.0 Các hàm preg khuyến cáo chạy nhanh so với hàm ereg 2.2.2.1 Hàm ereg int ereg (string pattern, string subject [, array groups]) Hàm ereg trả độ dài chuỗi so khớp với pattern subject 2.2.2.2 Hàm ereg_replace string ereg_replace (string pattern, string replacement, string subject) Hàm thay tất đoạn ký tự thỏa mãn biểu thức quy pattern chuỗi replacement chuỗi subject 2.2.2.3 Hàm split array split (string pattern, string subject [, int limit]) Hàm chia chuỗ i subject thành mả ng chuỗi thỏ a mãn biể u thức quy pattern 2.2.3 Tập hàm mb_ereg Tập hàm mb_ereg làm việc giống hoàn toàn với thàm ereg khác điểm là: Các hàm ereg thao tác so khớp biể thức quy chuỗi tạo nên từ ký tự bit, hàm mb_ereg làm việc với ký tự nhiều byte ví dụ ký tự tiếng Trung quốc tạo từ byte 3 Tài liệu tham khảo - http://www.catswhocode.com/blog/15-php-regular-expressions-for-web-developers - Wikipedia - http://www.regular-expressions.info/php.html [...]... nhiều hơn kích thư c của mảng kết quả trả về sẽ là 0 Hai số nguyên đầu tiên trong mảng chứa vị trí bắt đầu của biểu thức được tìm thấy và số byte trong biểu thức được tìm thấy Các cặp số nghuyên chứa vị trí bắt đầu và chiều dài của các tham chiếu ngược Vì vậy array[n*2] là các vị trí bắt đầu của các chuỗi thỏa mãn biểu thức chính quy và các array[n*2+1] là độ dài tương ứng của các chuỗi Thư viện PCRE chỉ... nhóm Biểu thức chính quy sử dụng các ký tự mở ngoặc tròn ( và đóng ngoặc tròn ) để phân nhóm các ký tự Ví dụ /([a-z0-9]+)@([a-z]+)/ : biểu diễn một biểu thức chính quy so khớp với các chuỗi ký tự gồm các ký tự từ a đến z hoặc từ 0 đến 9 là một nhóm đứng liền nhau lặp lại ít nhất 1 lần theo sau là ký tự @ tiếp theo là một nhóm ký tự từ a đến z lặp lại ít nhất 1 lần 2 Thư viện biểu thức chính quy trong ngôn. .. quy trong ngôn ngữ lập trình PHP 2.1 Thư viện PCRE l(Perl-Compatible Regular Expressions) PCRE viết tắt cho Perl-Compatible Regular Expressions Đây là tên của một thư viện mã nguồn mở được viết bằng ngôn ngữ C bởi Phillip Hazel Thư viện tương thích với hầu hết các trình biên dịch C và các hệ điều hành Nhiều người đã phát triển các thưc viện từ PCRE làm cho nó tương thích với các ngôn ngữ lập trình khác... preg_match(‘/regex/’,$subject) Dấu ‘/’ là để nhận biết biểu thức chính quy, nếu biểu thức chính quy cần có dấu ‘/’ thì phải thêm ‘\’ đằng trước Ví dụ: http://dantri.com.vn -> trong biểu thức chính quy phải viết là: ‘/http:\/\/dantri.com.vn/’ Không giống như C# hay Java, PHP không yêu cầu loại bỏ toàn bộ ‘\’ trong chuỗi biểu thức Nếu muốn thêm dấu ‘\’ như là 1 ký tự trong xâu PHP, bạn chỉ cần loại bỏ nó nếu nó... bỏ Trong xâu được bao bọc bởi dấu nháy đơn, chỉ ký tự nháy đơn và ‘\’ cần được loại bỏ Dó là lý do tại sao biểu thức chính quy ở trên đây, chúng ta không cần phải dùng ‘\\’ để nhận biết dấu chấm (.) Để xác định chuỗi ‘\\’ trong php thì biểu thức chính quy phải viết là ‘/\\\\/’ Một vài các option trong biểu thức chính quy: /regix/x - x=i ->Không phân biệt chữ hoa, chữ thư ng - x=s -> lấy tất cả các. .. cấp, hỗ trợ cho việc tìm kiếm thay thế hay chia tách chuỗi….Tuy nhiên đây không phải vấn đề lớn khi bạn có thể dễ dàng làm được điều đó qua việc viết code 2.2 Các nhóm hàm của regular expression trong PHP 2.2.1 Tập các hàm preg Tất cả các hàm preg yêu cầu bạn phải đặc tả biểu thức chính quy như là 1 chuỗi sử dụng cú pháp Perl Trong Perl, /regex/ định nghĩa 1 biểu thức chính quy Trong PHP, nó trở thành... một số Delphi component chỉ đơn giản là hàm bao quanh thư viện PCRE biên dịch thành một thư việ Win32 DLL Thư viện cũng bao gồm nhiều phiên bản Linux được chia sẻ như thư viện so và các file h Các hàm preg PHP và các lớp REALbasic Regex được xây dựng dựa trên PCRE PCRE thực hiện gần như cú pháp biểu thức chính quy của Perl 5.8, chỉ có sự hỗ trợ các thuộc tính Unicode với \p là không đầy đủ mặc dù hầu... thế tất cả các đoạn ký tự thỏa mãn biểu thức chính quy pattern bằng chuỗi replacement trong chuỗi subject 2.2.2.3 Hàm split array split (string pattern, string subject [, int limit]) Hàm chia chuỗ i subject thành mả ng các chuỗi thỏ a mãn biể u thức chính quy pattern 2.2.3 Tập các hàm mb_ereg Tập các hàm mb_ereg làm việc giống hoàn toàn với các thàm ereg chỉ khác ở một điểm duy nhất đó là: Các hàm ereg... repacement Hàm callback sẽ được gọi mỗi khi biểu thức chính quy được so khớp đúng, tham số của hàm callback có thể là một mảng hoạc các chuỗi Callbacks cho phép bạn làm tìm kiếm mạnh mẽ và thay thế các hoạt động mà bạn không thể làm với các biểu thức thông thư ng một mình Ví dụ: nếu bạn tìm kiếm cho regex(\ d +) \ + (\ d +), bạn có thể thay thế 2 +3 với 5 bằng cách sử dụng Callback: function regexadd($groups)... hiện việc phân chia chuỗi subject thành các chuỗi thỏa mãn được so khớp đúng với patterm và trả về một mảng các chuỗi phân tách được 2.2.2 Tập các hàm ereg Các hàm ereg yêu cầu bạn xác định biểu thức chính quy như một chuỗi, như bạn mong muốn ereg ('regex', "subject") kiểm tra nếu regex phù hợp với subject Bạn nên sử dụng dấu nháy đơn khi viết một biểu thức chính quy như là một chuỗi ký tự Một số ký tự ... lặp lại ký tự, nhóm ký tự trước x lần - {x,y}: Mang ý nghĩa lặp lại ký tự, nhóm ký tự trước từ x đến y lần - {x,}: Mang ý nghĩa lặp lại ký tự, nhóm ký tự trước lớn x lần 1.4.6 Phân nhóm Biểu thức... mang ý nghĩa lặp lại ký tự, nhóm ký tự trước từ đến n lần - Ký tự + : mang ý nghĩa lặp lại ký tự, nhóm ký tựn trước từ đến n lần - Ký tự ? : mang ý nghĩa lặp lại ký tự, nhóm ký tự trước lần - Ngoài... tròn ) để phân nhóm ký tự Ví dụ /([a-z0-9]+)@([a-z]+)/ : biểu diễn biểu thức quy so khớp với chuỗi ký tự gồm ký tự từ a đến z từ đến nhóm đứng liền lặp lại lần theo sau ký tự @ nhóm ký tự từ a

Ngày đăng: 17/04/2016, 21:26

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan