2012-12-25 95 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