PHPでCSSセレクタでDOM解析してみたい・・・
そんな時に Zend DOM Query っていう便利なライブラリを見つけました。
それを使って PHPでCSSセレクタを使う方法とかコード例を 紹介
このページの目次
まず Zend Dom Query を導入しよう
大前提として、PHPでCSSセレクタは使えません。(当たり前)
そこで役立つのが Zend DOM Qery というパッケージ
もし composer を使ってるなら、次のコマンドで即導入できます。
1 |
composer require zendframework/zend-dom |
これで vendor 以下にライブラリが作成されるはず
使うときは autoload.php を読み込みするだけです。
1 2 |
/// 使うときはこの1行を書くだけ require_once 'vendor/autoload.php'; |
あるいは次の GitHubページ から直DLもOK
どっちを使って導入するかは個人の好みです(composerの方が圧倒的に楽だけど、、、)
使い方1.CSSセレクタから要素リストを取得する基本手順
まずは Zend DOM Query の基本の使い方について
その箇条書きすると次の通りです。
- DOMオブジェクトをHTMLから作成
- executeメソッドにCSSセレクタ渡す
- 結果がノードリストとして返ってくる
- 値とか属性とかいろいろ取得・・・
次みたいな使い方ができます。
例えば次みたいなHTMLがあるとしましょう。
1 2 3 |
<div class="item">Hoge</div> <div class="item">Fuga</div> <div class="item">Piyo</div> |
こういう風な同じクラス名( item )がついてる要素
これらを一気に取得したいときに、Zend Query が便利ですね。
例えば次のコードを書けば、CSSセレクタからノードリスト取得できます。
▼ 具体的なコード例はコチラ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use Zend\Dom\Query; /// 解析対象のHTML $html = <<<EOM <div class="item">Hoge</div> <div class="item">Fuga</div> <div class="item">Piyo</div> EOM; /// 要素のテキストを1つずつ表示 $dom = new Zend\Dom\Query($html); $itemlist = $dom->execute('div.item'); foreach ( $itemlist as $item ) { echo '$item.nodeValue : ' . $item->nodeValue; } |
▼ このコードの出力結果
1 2 3 |
$item.nodeValue : Hoge $item.nodeValue : Fuga $item.nodeValue : Piyo |
まず Query オブジェクトに解析対象のHTMLを渡し、
そして
div.item みたいに普通のCSSセレクタを渡せいいだけ
セレクタにも制限はないので、jQeryとかと全く同じ感覚で使えるのも便利です。
使い方2.属性値から要素リストを取得する方法
このZend Query では、CSSセレクタに属性値も指定できます。
まあCSSセレクタを扱えるライブラリだから当たり前だけど・・・
あとこれが便利なのは、
正規表現(
~= とか
*= みたいなの)も使用できるとこです。
▼ この記事で詳しく解説したやつ
これを使って属性値から要素リストとか取得できます。
例えば、連番になってる属性値の要素を取得したいことないですか?
CSSセレクタで正規表現を使えば、そういうのも簡単です。
▼ 具体的なコード例は次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/// 解析対象のHTML $html = <<<EOM <div id="a-1">A-1</div> <div id="a-2">A-2</div> <div id="a-3">A-3</div> <div id="b-1">B-1</div> <div id="b-2">B-2</div> EOM; /// 要素テキストを1つずつ表示 $dom = new Zend\Dom\Query($html); $itemlist = $dom->execute('[id*="a-"]'); foreach ( $itemlist as $item ) { /// 要素のテキストを1つずつ表示 echo '要素テキスト : ' . $item->nodeValue; } |
▼ このコードの実行結果
1 2 3 |
要素テキスト : A-1 要素テキスト : A-2 要素テキスト : A-3 |
ここではid属性が a- を "含むものだけ" で絞り込みしてます。
連番とかプレフィクスとか、そういう要素だと便利かもしれない
Zend Dom Query で要素名とか属性情報を調べるには
この Zend Dom Query で返されるノードリスト
そのノードリストは DOMElement 型で返されることに注意
Zend Query 独自のものではなくて、PHPで初めから用意されてるデータ型です。
それを使い、取得したノードの属性情報を調べる方法を最後にまとめときます。
1.属性名を調べる方法&コード例
属性名を調べるにはノードの nodeName を参照するだけ
同名のクラスの要素名とかを調べるのに便利です。
▼ 例えば同じクラスの要素名を調べてるコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// 解析するHTML $html = <<<EOM <p class="item">Hoge</p> <span class="item">Fuga</span> <div class="item">Piyo</div> EOM; /// 要素名を1つずつ表示 $dom = new Zend\Dom\Query($html); $itemlist = $dom->execute('.item'); foreach ( $itemlist as $item ) { /// 要素のテキストを1つずつ表示 echo '要素名 : ' . $item->nodeName; } |
▼ このコードの実行結果
1 2 3 |
要素名 : p 要素名 : span 要素名 : div |
まあ要素名だけ取得したい、なんて場面はないですけどね・・・
でも要素名を知りたいなら、 nodeName プロパティを参照すれば分かります。
2.属性名や属性値を調べるには
次は属性名や属性値を調べる方法について
これらは次の手順で取得可能
- まずノードの attributes を参照
- foreach 内で属性情報を取得
- 属性名とか属性値の情報を調べる
属性もノードとして扱われるから、
属性名は
nodeName 、属性値は
nodeValue から調べることができます。
▼ 具体的なコード例は次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/// 解析したいHTML $html = <<<EOM <div data-hoge="HOGE" /> <div data-fuga="FUGA" /> <div data-piyo="PIYO" /> EOM; /// 属性名と属性値をすべて表示 $dom = new Zend\Dom\Query($html); $elem_list = $dom->execute('div'); foreach ( $elem_list as $elem ) { /// この要素の属性をすべて解析 foreach ( $elem->attributes as $attr) { echo '['.$attr->nodeName.'] : '.$attr->nodeValue.'<br>'; } } |
▼ このコードの実行結果
1 2 3 |
[data-hoge] : HOGE [data-fuga] : FUGA [data-piyo] : PIYO |
属性名とか属性値もノードとして普通に取得できます。
ただやり方が分からないと少し混乱するかも
ここまでのまとめ
一言でいうなら「Zend DOM Query 便利だよ」っていう話
便利だけど使い方を忘れそうなので、一応記事にして残りしておきます。
以上、PHPでCSSセレクタで要素解析する方法でした。ではまた!