タグ解析

先日の日記の続きです。


タグ解析と言っても自分で書くのはしんどいのでできるだけ楽します。
ということで「PEAR::XML_HTMLSax3」を使います。
PEARのインストールについては割愛、実際私はインストールせずに任意のフォルダに解凍しset_include_path()して使っています。

タグ解析はこれでほぼ半分ぐらい完成だったりします。
あとはXML_HTMLSax3のサンプルを見本にして

$handler = new MyHandler();
$parser =& new XML_HTMLSax3();
$parser->set_option('XML_OPTION_TRIM_DATA_NODES');
//タグ始と終の処理をする関数
$parser->set_element_handler('openHandler','closeHandler');
//データの処理をする関数
$parser->set_data_handler('dataHandler');
//先日のfsockopen()で取り出したHTML
$parser->parse($body);

今回コメントアウトJavaScriptなどの解析はしないので「set_element_handler」と「set_data_handler」だけ作ります。

class MyHandler {
    //タグ
    var $tags;
    //一時タグ名
    var $tag;
    //テキストデータ
    var $datas;
    //初期化
    function MyHandler(){
        $this->tags  = array();
        $this->tag   = '';
        $this->datas = array();
    }
    //タグ開始
    //array(タグ名 => アトリビュート) タグ名を一時保存
    function openHandler(& $parser, $name, $attrs) {
        $this->tags[] = array($name => $attrs);
        $this->tag    = $name;
    }
    //タグ終了
    //タグ名をクリア
    function closeHandler(& $parser,$name) {
        $this->tag = '';
    }
    //テキストデータ 
    //array(タグ名 => テキストデータ)
    function dataHandler(& $parser, $data) {
        $this->datas[][$this->tag] = $data;
    }
}

どのタグにどのアトリビュートが含まれているか、テキストが何のタグに挟まれているかが取得できます。
階層もほしい場合などはそれに合わせて書き換えてください。


Googleで実行した結果の一部です。

print_r($handler->tags);

Array
(
    [0] => Array
        (
            [html] => Array
                (
                )

        )

    [1] => Array
        (
            [head] => Array
                (
                )

        )

    [2] => Array
        (
            [meta] => Array
                (
                    [http-equiv] => content-type
                    [content] => text/html; charset=Shift_JIS
                )

        )
print_r($handler->datas);

Array
(
    [0] => Array
        (
            [title] => Google
        )

    [1] => Array
        (
            [style] => body,td,a,p,.h{font-family:arial,sans-serif}.h{font-size:20px}.h{color:#3366cc}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}
        )

    [2] => Array
        (
            [script] => window.google={kEI:"vTtdR_T_OJWMsALD5p34Bg",kEXPI:"17259,17735",kHL:"ja"};function sf(){document.f.q.focus()}
        )