
FavoritesFollows(f14s.pw) で、ハマっていた simplexml_load_string のエラーハンドリング。最終的に、取得使用としていたRSSが、UTF-16 だったりと散々な結果に。一応、はてな なので相談をして、とりあえず動くものが出来たので、ソースを晒しておきます。
function getXmlData($rss_url = NULL) {
set_error_handler(function($errno, $errstr, $errfile, $errline) {
throw new Exception($errstr, $errno);
});
try {
$search = array("\0", "\x01", "\x02", "\x03", "\x04", "\x05","\x06", "\x07", "\x08", "\x0b", "\x0c", "\x0e", "\x0f");
$options = array(
'http' => array(
'method' => 'GET',
'header' => 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36',
),
);
$context = stream_context_create($options);
$xml_context = file_get_contents($rss_url, false, $context);
$xml_context = str_replace($search, '', $xml_context);
if (mb_detect_encoding($xml_context, 'UTF-8', true) === false) {
$xml_context = utf8_encode($xml_context);
}
if (strpos($xml_context, '<?xml', 0) === false){
echo "×:Error:". $rss_url . "\n";
return false;
}
$xml = simplexml_load_string($xml_context);
if ($xml === false) {
echo "Failed loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
return false;
}
restore_error_handler();
} catch (Exception $ex) {
restore_error_handler();
echo "×:Exception". $ex . "\n";
echo "×:Error:". $rss_url . "\n";
return false;
}
return $xml;
}
ネットぐるぐるしまくって、いろいろな対策を施したソースなので、大抵のXMLはエラーにならないと思います。自己責任でどうぞ。