1

このコードは、最悪のタイミングで機能を停止するまで、何日も機能していました。NOAA の Web サイトから気象警報情報を取得し、マイページに表示するだけです。なぜこれが突然失敗するのか誰か教えてください。

$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'

修飾子.使用すると、任意の文字に一致します。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 に答える