|
Trang 1 / 3 Trong seri bài viết về các hàm xử lý chuỗi này, xin giới thiệu với các bạn những công cụ mạnh nhất mà nếu nắm vững nó, bạn sẽ có khả năng rất lớn trong việc phát triển cho mình những cách lấy tin từ các báo khác nhau.
Mỗi ngày một ít, tôi sẽ cố gắng giải thích bằng cách dễ hiểu nhất, có gì thiếu sót hoặc sai, các bạn bổ sung thêm nhé, mình vừa làm vừa học mà. Lấy một ví dụ đầu tiên. preg_match_all('/<table>(.*?)<\/table>/s',$content,$matches,PREG_SET_ORDER); Trong hàm preg_match_all thì tham số đầu tiên là mẫu tìm kiếm (pattern). Cấu trúc của 1 pattern là quan trọng nhất, khi bạn nắm vững các kí tự đặc biệt dành cho pattern thì mọi việc sẽ rất dễ dàng.
Cấu trúc: <delimiter><pattern><delimiter> [<modifiers>] - <delimiter> : có thể là / @ #
- <pattern> : mẫu tìm kiếm
- <modifiers> : bổ sung tùy chỉnh tìm kiếm.
Bài này sẽ giới thiệu về các kí tự đặc biệt trong Bảng các kí tự đặc biệt trong pattern | Kí tự | Chức năng | | \ | Nếu bạn dùng các kí tự đặc biệt chỉ như là một kí tự bình thường thì bạn dùng kí tự đặc biệt kết hợp với \, và \ được gọi là escape character. Chẳng hạn, dấu chấm . đại diện cho 1 kí tự bất kì trừ newline, thì để tìm trong 1 chuỗi dấu chấm bạn phải dùng \. | | . | đại diện cho 1 và chỉ 1 kí tự bất kì trừ newline VD: preg_match('/./', 'PHP', $matches); $matches Array ( [0] => P )
| | ? | Chỉ ra rằng kí tự đứng trước nó có thể có mặt 0 hoặc nhiều lần. '/PHP.?5/' sẽ phù hợp với PHP 5,PHP5,PHPx5,PHP35....
| | + | Chỉ ra rằng kí tự đứng trước nó có thể có mặt 1 hoặc nhiều lần. '/a+b/' sẽ phù hợp với 'ab', 'aab', 'aaaaaaaab', nhưng sẽ không phù hợp với 'b' preg_match('/a+b/', 'caaabc', $matches);
$matches Array ( [0] => aaab )
| | * | Chỉ ra kí tự đứng trước có thể có mặt 0 hoặc nhiều lần '/de*f/' phù hợp với 'df', 'def' và 'deeeef' | | {m} {m.n} | Kí tự đứng trước phải xuất hiện đúng m lần hoặc từ m đến n lần '/TRe{1,2}f/' phù hợp với 'tref' và 'treef', và không phù hợp với 'TReeef'. Đặc biệt: {,n} --> từ 0 đến n lần {m,} --> từ m đến vô hạn '/fo{2,}ba{,2}r/' phù hợp với 'foobar', 'fooooooobar', 'fooobaar', nhưng ko phù hợp với 'foobaaar'. | | ^ | Bắt buộc phải đứng đầu ' /^ghi/' phù hợp với 'ghik' và 'ghi', nhưng ko phù hợp với 'fghi'. | | $ | Bắt buộc phải kết thúc, đứng sau cùng '/Derick$/' phù hợp với "Rethans, Derick" và "Rethans, Derick\n" không phù hợp với "Derick Rethans". | | [ ... ] | Tạo một lớp kí tự có thể xuất hiện, chẳng hạn bạn biết rằng sẽ có 2 trường hợp trong 1 liên kết như sau: < a href="http://quanphp.net">quanphp.net < a href='http://quanphp.net'>quanphp.net Ở trên là dấu nháy kép, bên dưới là dấu nháy đơn, vậy làm sao để nhận 2 trường hợp đó là liên kết mà ko bỏ sót? đó là ý nghĩa của lớp (class) Trong ví dụ trên lớp này sẽ là [\'"] Trong 1 lớp bạn chỉ có thể dùng các kí tự sau:
- - : đại diện cho 1 khoảng các kí tự : a-z A-Z
- \ : escape character
- ^ phần ngược lại , ví dụ:
preg_match('/[^0-9]+/', 'PHP is released in 2005.',$matches); $matches Array ( [0] => PHP is released in )
| | ( ... ) | Tạo 1 mẫu con, chẳng hạn bạn có chuỗi 'PHP in 2005.' và bạn muốn có chính xác cả thế kỉ (20) và năm hiện tại (05) bạn phải dùng mẫu sau : '/([12][0-9])([0-9]{2})/' Gồm 2 mẫu con ([12][0-9]) phù hợp với 10 --> 29. ([0-9]{2}) phù hợp với năm hiện tại. preg_match( '/([12][0-9])([0-9]{2})/', 'PHP in 2005.', $matches );
$matches Array ( [0] => 2005 [1] => 20 [2] => 05 )
Phần tử đầu tiên (chỉ số 0) luôn chứa toàn bộ các chuỗi con. | | (?: ...) | Tạo 1 mẫu con mà phần đó sẽ ko có trong kết quả trả về. preg_match('@([A-Za-z ]+)(?:hans)@', 'Derick Rethans', $matches);
$matches Array ( [0] => Derick Rethans [1] => Derick Ret )
Phần tử đầu tiên (chỉ số 0) luôn chứa toàn bộ các chuỗi con. | | (?P...) | Tạo 1 mẫu con và đặt tên cho nó. preg_match( '/(?P<century>[12][0-9])(?P<year>[0-9]{2})/', 'PHP in 2005.', $matches );
$matches Array ( [0] => 2005 [century] => 20 [1] => 20 [year] => 05 [2] => 05 )
| Ok vậy là xong phần thứ nhất, và hay nhất của các hàm xử lý chuỗi PCRE Perl Regular Expression Library Bài của admin quanphp.NET
Tin mới hơn:
Tin cũ hơn: |