それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

XpathでRSS広告を外す至高のメニュー

Xpathって条件かけるんですよね。プログラミング言語で、IF分や正規表現マッチをすると、条件の再利用がめんどくさいのでXpathでやってみた。

XpathRSS広告以外のエントリを取得する

/rss/channel/item[not(contains(./title,"PR"))]

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が便利なんだけど、しばらく使わないと使い方忘れて右往左往するので、よく使いそうな使い方で暗記することにした。

Xpath最高ですね。

xpath便利です。
協力してくれたM先生ありがとうございました。

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

みっちゃんありがとう。感謝します。