Bài toán này dễ gặp nhất khi chúng ta thực hiện việc bóc tách dữ liệu từ các website khác. Kĩ thuật tuy không khó nhưng không phải ai cũng biết :D. Trong bài viết này chúng ta sẽ nghiên cứu xem làm thế nào để lấy dữ liệu giữa các tag.
Phương pháp lấy nội dung từ tag
Bằng cách sử dụng một trong hai hàm preg_match() hoặc preg_match_all(), chúng ta có thể thực hiện dễ dàng:
<?php /** * * @get text between tags * * @param string (The string with tags) * * @param string $tagname (the name of the tag * * @return string (Text between tags) * */ function getTextBetweenTags($string, $tagname) { $pattern = "/<$tagname>(.*?)<\/$tagname>/"; preg_match($pattern, $string, $matches); return $matches[1]; } ?> |
Cách này khá đơn giản và dễ dùng tuy nhiên tốc độ tìm kiếm và code lập trình của bạn sẽ nhiều hơn và ít sáng sủa hơn. Chúng ta hãy cùng xem thử một cách khác: sử dụng DOM function.
<?php /** * * @get text between tags * * @param string $tag The tag name * * @param string $html The XML or XHTML string * * @param int $strict Whether to use strict mode * * @return array * */ function getTextBetweenTags($tag, $html, $strict=0) { /*** a new dom object ***/ $dom = new domDocument; /*** load the html into the object ***/ if($strict==1) { $dom->loadXML($html); } else { $dom->loadHTML($html); } /*** discard white space ***/ $dom->preserveWhiteSpace = false; /*** the tag by its tag name ***/ $content = $dom->getElementsByTagname($tag); /*** the array to return ***/ $out = array(); foreach ($content as $item) { /*** add node value to the out array ***/ $out[] = $item->nodeValue; } /*** return the results ***/ return $out; } ?> |
Trong đó các giá trị:
$tag :Tag để tìm
$html: nguồn HTML hoặc XML để tìm kiếm.
$strict: cho biết load HTML hay XML. Trong hàm trên chúng ta mặc định load HTML.
Hãy so sánh cách sử dụng để biết cách làm nào tiện dụng và sáng sủa hơn.
Sử dụng cách 1:
<?php $html = '<body> <h1>Heading</h1> <a href="http://nhanweb.com">NHANWEB.COM</a> <p>paragraph here</p> <p>Paragraph with a <a href="http://nhanweb.com">LINK TO NHANWEB</a></p> <p>This is a broken paragraph </body>'; $content = getTextBetweenTags('a', $html); foreach( $content as $item ) { echo $item.'<br />'; } ?> |
Sử dụng cách 2
<?php $xhtml = '<html> <body> <para>This is a paragraph</para> <para>This is another paragraph</para> </body> </html>'; $content2 = getTextBetweenTags('para', $xhtml, 1); foreach( $content2 as $item ) { echo $item.'<br />'; } ?> |
Do các kĩ thuật này không giành cho các bạn mới làm quen với PHP (vì các bạn mới làm quen với PHP chắc ít đụng tới việc bóc tách dữ liệu). Cho nên, mình không giải thích nhiều về 2 cái này nữa. Bạn nào hỏi thì mình cố gắng trả lời trong tầm hiểu biết hạn hẹp của mình thôi hen. Mình cũng đang sử dụng cách thứ 2 để bóc tách dữ liệu từ TuoiTre đó các bạn :D