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



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

相关内容

  • 没有找到相关文章

最新更新