这段代码工作了好几天,直到在最糟糕的时候停止工作。它只是从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
您的regexp试图匹配字面值字符串<div id="content">
,然后是一些(尽可能少的)字符,不是反引号 (`
),然后是字面值字符串</div>
。
然而,在当前的NOAA预警和咨询中,在<div id="content">
和</div>
之间有一个反号:
这就是为什么你的regexp不匹配。
最简单的"修复"是将regexp替换为,例如:'#<div id="content">(.*?)</div>#s'
其中.
将使用s
修饰符匹配任何字符。
但是,您真正应该做的是使用适当的HTML解析器来提取文本,而不是尝试使用regexp来解析HTML。
Edit:这里有一个快速示例(未经测试!),说明如何使用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;