2012-12-25 143 views
1

此代碼是工作了好幾天,直到它停在最糟糕的時候工作。它只是從NOAA網站提取天氣預報信息並將其顯示在我的頁面上。有人可以告訴我爲什麼這會突然失敗嗎?爲什麼preg_match_all突然停止工作?

$file = file_get_contents("http://forecast.weather.gov/showsigwx.php?warnzone=ARZ018&warncounty=ARC055"); 
preg_match_all('#<div id="content">([^`]*?)<\/div>#', $file, $matches); 
$content = $matches[1]; 

echo "content = ".$content."</br>" ; 
echo "matches = ".$matches."</br>" ; 
print_r ($matches); echo "</br>"; 
echo "file </br>".$file."</br></br>" ; 

現在我所得到的只是一個空的數組。

這是輸出..

content = Array 
matches = Array 
Array ([0] => Array () [1] => Array ()) 
file = the full page as requested by file_get_contents 

回答

7

你的正則表達式嘗試匹配的文本字符串<div id="content">,其次是一些(儘可能少)字符不在反引號`),其次是字符串</div>

然而,當前集中的NOAA warnings and advisories,有<div id="content"></div>之間的反引號:

 
A SLIGHT RISK FOR SEVERE THUNDERSTORMS IS IN EFFECT FOR NORTHEAST 
MISSISSIPPI SOUTH OF A CALHOUN CITY TO FULTON MISSISSIPPI LINE 
FROM LATE THIS AFTERNOON THROUGH THIS EVENING. DAMAGING WINDS 
WILL BE THE MAIN THREAT...HOWEVER AN ISOLATED TORNADO CAN`T BE 
RULED OUT. 

這就是爲什麼你的正則表達式不匹配。

最簡單的 「修復」 將替換爲正則表達式,說:

'#<div id="content">(.*?)<\/div>#s' 

其中.會,與smodifier,比賽任何字符。

但是,你真正應該做的是use a proper HTML parser提取文本,而不是試圖用正則表達式解析HTML。


編輯:這裏有一個簡單的例子,你怎麼可以這樣跟DOM文檔(未經測試!):

$html = file_get_contents($url); 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$content = $doc->getElementById('content')->textContent; 

甚至只是:

$doc = new DOMDocument(); 
$doc->loadHTMLFile($url); 
$content = $doc->getElementById('content')->textContent; 
+0

WOW。謝謝。我從來不會抓到那個。我對PHP非常陌生,並且正在努力學習。你推薦我用什麼? – user1928523

+0

[DOM文檔:: loadHTML()](http://docs.php.net/manual/en/domdocument.loadhtml.php)工作得很好,並內置到PHP。 –

+0

我真的很感激輸入和我一直在試圖讓我的頭解決這個問題,失敗,過去一小時。我通常更喜歡學習我在做什麼,但我真的需要快速恢復。我將如何實現DOM方法? – user1928523