1

这段代码工作了好几天,直到它在最糟糕的时候停止工作。它只是从 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
4

1 回答 1

7

您的正则表达式正在尝试匹配文字 string <div id="content">,然后是一些(尽可能少)不是反引号( `) 的字符,然后是文字 string </div>

但是,在当前的NOAA 警告和建议中,和之间一个反引号:<div id="content"></div>

东北地区有轻微的强雷暴风险
密西西比州南部卡尔霍恩市至富尔顿密西西比线
从今天下午晚些时候到今天晚上。破坏性的风
将是主要威胁...但是孤立的龙卷风是不可能的
排除。

这就是您的正则表达式不匹配的原因。

最简单的“修复”是将正则表达式替换为:

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

where.将使用s 修饰符匹配任何字符。

但是,您真正应该做的是使用适当的 HTML 解析器来提取文本,而不是尝试使用正则表达式解析 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;
于 2012-12-25T17:29:05.053 回答