为什么这个preg_match_all会突然停止工作?

use*_*523 1 php file-get-contents

这段代码工作了几天,直到它在最糟糕的时间停止工作.它只是从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>" ;
Run Code Online (Sandbox Code Playgroud)

现在我得到的只是一个空数组.

这是输出..

content = Array
matches = Array
Array ( [0] => Array ( ) [1] => Array ( ) )
file = the full page as requested by file_get_contents
Run Code Online (Sandbox Code Playgroud)

Ilm*_*nen 7

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

然而,在当前的一套NOAA警报和咨询,有之间的反引号<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'
Run Code Online (Sandbox Code Playgroud)

在那里.将与s 修改,匹配任何字符.

但是,您真正应该做的是使用适当的HTML解析器来提取文本,而不是尝试使用regexp解析HTML.


编辑:这是一个快速的例子(未经测试!),你如何使用DOMDocument做到这一点:

$html = file_get_contents( $url );  
$doc = new DOMDocument();
$doc->loadHTML( $html );
$content = $doc->getElementById( 'content' )->textContent;
Run Code Online (Sandbox Code Playgroud)

甚至只是:

$doc = new DOMDocument();
$doc->loadHTMLFile( $url );
$content = $doc->getElementById( 'content' )->textContent;
Run Code Online (Sandbox Code Playgroud)