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;
        }
    }
?>

関係あるかも?

このエントリは次のエントリから参照されているみたいです

コメント

コメントはありません。

名前
メール
コメント

※HTML タグは使えません。HTTP URL には自動リンクが張られます。

Captcha
画像から読み取れる文字を入力: