Zend_Dom_Queryで遊ぶ

高木さんとこの日記
http://d.hatena.ne.jp/takagimasahiro/20080717
で、Zend_DomとかあったんでincubatorとZend_Httpしかチェックしてなかった私は、ん?とか思ったんですが、いきなりstandardのsvnに入ってるんですね。
あれー、Zend_Http_Response_Parser
http://framework.zend.com/wiki/display/ZFPROP/Zend_Http_Response_Parser+-+Jason+Eisenmenger
はどうすんのーとか疑問におもっちゃいけませんね。

ということで、ちょっと遊んでみる。

<?php
//@see http://en.yummy.stripper.jp/?eid=800109
$html = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>サッカーニュース</title>
<body>
<ul class="news">
  <li>
    <a href="http://sportsnavi.yahoo.co.jp/soccer/index.html">Cロナウドが休日返上宣言!</a>
  </li>
  <li>
    <a href="http://sportsnavi.yahoo.co.jp/soccer/italia.html">123</a>
  </li>
  <li>
    <a href="http://test.org/article/vender-15.html">バルセロナが前回王者セビージャを下す=スペイン国王杯</a>
  </li>
  <li>
    <a href="../soccer/index.html">ユベントス奮闘、5&#8722;3でエンポリを下す=イタリア杯</a>
    <a href="testhtm.htmll">ユベントス</a>
  </li>
</ul>
</body>
</html>
HTML;

require_once 'Zend/Dom/Query.php';

$q = new Zend_Dom_Query($html);
var_dump($q->query('ul.news>li')->getXpathQuery()); 
echo "----------------------------------------";echo PHP_EOL;
class MyResultFilterIterator extends FilterIterator{

    public static $searchAttribute;
    public static $searchvalue;
   
    public function __construct( Iterator $it , $searchAttribute, $searchvalue){
      parent::__construct( $it );
      self::$searchAttribute = $searchAttribute;
      self::$searchvalue = $searchvalue;
    }
    function accept(){
        return !strcmp(parse_url($this->current()->getAttribute(self::$searchAttribute), 
                       PHP_URL_HOST), self::$searchvalue);
    }
}

$my = new MyResultFilterIterator($q->query('a'), 'href', 'test.org');
foreach ($my as $m)  {
    echo $m->nodeValue;
    echo PHP_EOL;
}
echo "----------------------------------------";echo PHP_EOL;
foreach($q->query('a') as $count => $domElement) {
    $result[$count]['TEXT'] = $domElement->nodeValue;
    $result[$count]['link'] = $domElement->getAttribute('href');
}
var_dump($result);

結果

string(35) "//ul[contains(@class, ' news ')]/li"
----------------------------------------
バルセロナが前回王者セビージャを下す=スペイン国王杯
----------------------------------------
array(5) {
  [0]=>
  array(2) {
    ["TEXT"]=>
    string(37) "Cロナウドが休日返上宣言!"
    ["link"]=>
    string(47) "http://sportsnavi.yahoo.co.jp/soccer/index.html"
  }
  [1]=>
  array(2) {
    ["TEXT"]=>
    string(3) "123"
    ["link"]=>
    string(48) "http://sportsnavi.yahoo.co.jp/soccer/italia.html"
  }
  [2]=>
  array(2) {
    ["TEXT"]=>
    string(78) "バルセロナが前回王者セビージャを下す=スペイン国王杯"
    ["link"]=>
    string(38) "http://test.org/article/vender-15.html"
  }
  [3]=>
  array(2) {
    ["TEXT"]=>
    string(75) "ユベントス奮闘、5−3でエンポリを下す=イタリア杯"
    ["link"]=>
    string(20) "../soccer/index.html"
  }
  [4]=>
  array(2) {
    ["TEXT"]=>
    string(15) "ユベントス"
    ["link"]=>
    string(13) "testhtm.htmll"
  }
}

Zend_Dom_Query->query('')->getXpathQuery();
てなcss selectorからxpathの変換は良い感じ