此代码工作了几天,直到它在最糟糕的时间停止工作。它只是从NOAA网站提取天气警报信息并将其显示在我的页面上。有人可以告诉我为什么会突然失败吗?
$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
答案 0 :(得分: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'
其中.
与s
modifier匹配任何字符。
但是,您真正应该做的是use a proper HTML parser来提取文本,而不是尝试使用regexp来解析HTML。
编辑:这是一个关于如何使用DOMDocument执行此操作的快速示例(未经测试!):
$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;