ได้รับข้อมูลในรูปแบบไฟล์ HTML เพื่อให้ดึงค่าจากบางฟิลด์ (field) ออกมา ใช้ในการทำรายงาน
ในตอนแรกลองเขียนโปรแกรม PHP ขึ้นมาเอง โดยใช้ Regular Expression ทำไปซักพัก เริ่มยากขึ้น เหตุเพราะรูปแบบอันหลากหลายของไฟล์ HTML ไม่ว่าจะเป็นตัวอักษรพิมพ์ใหญ่เล็ก การเรียงลำดับ tag การเว้นวรรค
พบวิธีการดึงข้อมูลโดยใช้ PHP DOM ง่ายขึ้นเยอะ เลยนำมาแชร์เล่าสู่กันฟัง
ตัวอย่างไฟล์ test.html เพื่อจะดึงข้อมูล
$ cat test.html <html> <head> <title>My Page</title> </head> <body> <table> <tr> <td id="head_id">Id</td> <td id="head_name">Name</td> </tr> <tr> <td id="data_id1"><a href="view.php?id=1">1</a></td> <td id="data_name1">Alice</td> </tr> <tr> <td id="data_id2"><a href="view.php?id=2">2</a></td> <td id="data_name2">Bob</td> </tr> <tr> <td id="data_id3"><a href="view.php?id=3">3</a></td> <td id="data_name3">Carl</td> </tr> </table> </body> </html>
เริ่มต้นโหลดไฟล์ html ด้วย php dom
เขียนไฟล์ php เริ่มต้นโหลดไฟล์ html
<?php $html = new DOMDocument(); $html->loadHTMLFile('test.html'); var_dump($html); ?>
คำอธิบาย
- สร้าง object จาก class ชื่อ DOMDocument ตั้งไว้เป็นตัวแปรชื่อ $html
- เรียก method ชื่อ loadHTMLFile เพื่อโหลดไฟล์ HTML ที่ต้องการดึงข้อมูล (parse)
ทดลองรันโปรแกรม
$ php parse-dom.php
PHP Fatal error: Class 'DOMDocument' not found in /var/www/html/php/dom/parse-dom.php on line 3
$
รันแล้ว error แบบนี้ เพราะว่าไม่มี php module ที่ชื่อ dom
ต้องติดตั้ง extension ชื่อ libxml เพิ่มเติม ทำได้สองแบบ
หากคอมไพล์ php เอง ต้อง คอมไพล์ใหม่ด้วยการระบุออปชั่น –enable-libxml เพิ่มเติมตอนรัน configure
แต่ถ้าติดตั้ง php จาก rpm บน Fedora, RedHat หรือ CentOS ต้องติดตั้งไฟล์ php-xml เพิ่มเติม
ตัวอย่างติดตั้ง rpm เพิ่มเติม บน CentOS 5.5 (updates)
[root@web updates]# rpm -ivh php53-xml-5.3.3-1.el5.x86_64.rpm Preparing... ########################################### [100%] 1:php53-xml ########################################### [100%]
รัน php ด้วยออปชั่น -m เพื่อดู module ที่เพิ่มขึ้นมา
$ php -m
...
dom
wddx
xmlreader
xmlwriter
xsl
ทดลองรันโปรแกรมอีกครั้ง
$ php parse-dom.php object(DOMDocument)#1 (0) { }
ดึงข้อมูลตาม html tag ที่ต้องการ
ทำได้โดยง่ายด้วย method ชื่อ getElementsByTagName() ระบุชื่อ tag ที่ต้องการค้นหา
ตัวอย่าง ต้องการดึงข้อมูลที่อยู่ใน tag “td” หรือระหว่าง <td></td>
<?php $html = new DOMDocument(); $html->loadHTMLFile('test.html'); $tds = $html->getElementsByTagName('td'); foreach ($tds as $td) { print $td->nodeValue . "\n"; } ?>
ทดลองรันโปรแกรม จะเห็นผลลัพธ์ที่ได้
$ php parse-dom.php Id Name 1 Alice 2 Bob 3 Carl
ดึงข้อมูลตาม id ในไฟล์ html ที่ต้องการ
ทำได้โดยใช้ method ชื่อ getElementById() ระบุ id ที่ต้องการค้นหา
ตัวอย่าง ต้องการดึงข้อมูลที่อยู่ใน tag ที่ระบุด้วย id “data_name2”
<?php $html = new DOMDocument(); $html->loadHTMLFile('test.html'); $id2 = $html->getElementById('data_name2'); print $id2->nodeValue . "\n"; ?>
ทดลองรันโปรแกรม จะเห็นผลลัพธ์ที่ได้
$ php parse-dom.php Bob
ลองนำไปต่อยอด พัฒนากันต่อครับ