fetus Diary
2007/12/24(月) - 結果
こうかな。
<?php
require_once('HTTP/Client.php');
// HTTP_Client2 は用法・用量を守って正しくお使いください(謎
class HTTP_Client2 extends HTTP_Client {
var $_meta_refresh_threadshold = 5;
function setMetaRefreshThreadshold($second) {
$this->_meta_refresh_threadshold = max((int)$second, 0);
}
function _getMetaRedirect(&$request) {
if(!$this->_getMetaRedirect_CheckContentType($request)) {
return null;
}
if(!$parse_result = $this->_parseMetaRedirect($request->getResponseBody())) {
return null;
}
if($parse_result[0] <= $this->_meta_refresh_threadshold &&
$parse_result[1] != '')
{
$prev_url = $request->_url->getUrl();
$next_url = $this->_redirectUrl($request->_url, html_entity_decode($parse_result[1]));
if($next_url && $next_url != $prev_url) {
return $next_url;
}
}
return null;
}
function _getMetaRedirect_CheckContentType(&$request) {
$html_types = array('text/html', 'application/xhtml+xml');
$type = preg_replace('/\s*;.*?$/', '', strtolower($request->getResponseHeader('content-type')));
return in_array($type, $html_types);
}
function _parseMetaRedirect($html) {
$metas = $this->_getMetaElements($html);
foreach($metas as $meta) {
if(!isset($meta['http-equiv']) || !isset($meta['content'])) {
continue;
}
if(strtolower($meta['http-equiv']) === 'refresh') {
if(preg_match('!^\s*(\d+)\s*;\s*[uU][rR][lL]\s*=\s*(\S*)\s*!', $meta['content'], $match)) {
return array((int)$match[1], $match[2]);
}
}
}
return false;
}
function _getMetaElements($html) {
$regex = '<(?:[mM][eE][tT][aA])((?:(?:[\x20\x09\x0d\x0a]+)(?:(?:[[:alpha:]][[:alnum:]\-\.:_]*)'.
'(?:[\x20\x09\x0d\x0a]+)?=(?:[\x20\x09\x0d\x0a]+)?(?:(?:"[^"]*")|(?:\'[^\']*\')|(?:[['.
':alnum:]\-\.:_]+))))*)(?:[\x20\x09\x0d\x0a]+)?(?:/)?>';
$regex2 = '(?:[\x20\x09\x0d\x0a]+)(?:((?:[[:alpha:]][[:alnum:]\-\.:_]*))(?:[\x20\x09\x0d\x0a]+)'.
'?=(?:[\x20\x09\x0d\x0a]+)?((?:(?:"[^"]*")|(?:\'[^\']*\')|(?:[[:alnum:]\-\.:_]+))))';
$result = array();
if(preg_match_all("!${regex}!s", $html, $matches1, PREG_SET_ORDER)) {
foreach($matches1 as $match1) {
$tmp = array();
if(preg_match_all("!${regex2}!s", $match1[1], $matches2, PREG_SET_ORDER)) {
foreach($matches2 as $match2) {
$tmp[strtolower($match2[1])] = preg_replace('/^(["\'])(.*?)\1$/', '\2', $match2[2]);
}
$result[] = $tmp;
}
}
}
return $result;
}
}
?>
07/12/24 17:1107/12/25 12:11
関係あるかも?
このエントリは次のエントリから参照されているみたいです
- 2007/12/22(土) - HiNa - HTTP_Client の挙動がムカつく
コメント
コメントはありません。