2011-11-25 88 views
0

時已被告知,解析HTML的最佳方式是通過DOM這樣的:解析HTML

<? 

$html = "<span>Text</span>"; 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 

$elements = $doc->getElementsByTagName("span"); 
foreach($elements as $el) 
{ 
    echo $el->nodeValue . "\n"; 
} 


?> 

但在上述變量$ HTML不能是一個網址,也可以它?? 難道不我必須使用的功能get_file_contents()來獲取一個網頁的HTML?

回答

0

它可以是,但它取決於你的PHP安裝了allow_url_fopen被啓用。基本上所有的基於PHP文件的函數都可以接受一個URL作爲源(或目的地)。這樣的URL是否有意義取決於你想要做什麼。

例如做file_put_contents('http://google.com')不會工作,因爲你會試圖做一個HTTP上傳到谷歌,他們不會讓你更換他們的主頁...

但做$dom->loadHTML('http://google.com');會工作,並會吸在谷歌的主頁上進行DOM處理。

+0

好吧,我用網址替換了$ html,但它仍然沒有反饋標籤? – Shawn

+1

PHP DOM是相當挑剔的HTML語法,甚至略有畸形的HTML將導致其窒息。在加載遠程文檔時,可能想打開錯誤/警告顯示並查看是否有任何內容顯示。 –

0

如果您在使用DOM遇到問題,你可以使用CURL解析。例如:

$url = "http://www.davesdaily.com/"; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_URL, $url); 
$input = curl_exec($curl); 

$regexp = "<span class=comment>([^<]*)<\/span>"; 
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { 
    foreach($matches as $match); 
} 
    echo $match[0]; 

腳本應該抓住陣列$match內部<span class=comment></span>和商店之間的文本。這應該回顯Entertainment

1

你必須使用DOMDocument::loadHTMLFile從一個URL加載HTML。

$doc = new DOMDocument(); 
$doc->loadHTMLFile($path); 

DOMDocument::loadHTML解析一個HTML字符串。

$doc = new DOMDocument(); 
$doc->loadHTML(file_get_contents($path));