Xpathって条件かけるんですよね。プログラミング言語で、IF分や正規表現マッチをすると、条件の再利用がめんどくさいのでXpathでやってみた。
PHP5.2xなら
SimpleXMLが使えるのでとても便利。
<?php $xml = file_get_contents($url); $sxml = simplexml_load_string($xml); $sxml->xpath("/rss/channel/item[not(contains(./title,\"PR\"))]");
これでOK。
解説
item[not(contains(./title,"PR"))]
- [xxxxx]で、itemノードのうちxxx の条件にマッチする物を取り出す
- [ not xxxx] で itemノードのうち xxxx の条件にマッチしない物を取り出す
- contains() でitemノード以下属性から文字列を含む物を取り出す
- ./title で item/titleノードの文字列を検索対象にする
- PR で文字列があるかどうかをマッチさせる。
- これらの条件は () 括弧で囲む
- contains は関数。
応用
./title の代わりに、@href などを使うと、itemノード属性値文字列が対象になる。
or やAndでつなぐ [ xxx and yyy ] または [xxx or yyy ]
xpathが便利なんだけど、しばらく使わないと使い方忘れて右往左往するので、よく使いそうな使い方で暗記することにした。
2012-01-09 追記 ちなみにHTMLを扱うときは
<?php $url = "http://b.hatena.ne.jp/"; $html = file_get_contents($url); $doc = new DOMDocument(); $doc->strictErrorChecking = FALSE; #どうせエラーいっぱいだからチェックしない $doc->loadHTML($html); $xml = simplexml_import_dom($doc); $list = $xml->xpath("//body"); echo var_dump($list[0]);
http://drewish.com/content/2007/08/using_simplexml_with_html
みっちゃんありがとう。感謝します。