PHPでCSSセレクタが使える Zend Dom Query が便利だった

PHPでCSSセレクタでDOM解析してみたい・・・

そんな時に Zend DOM Query っていう便利なライブラリを見つけました。

それを使って PHPでCSSセレクタを使う方法とかコード例を 紹介

まず Zend Dom Query を導入しよう

大前提として、PHPでCSSセレクタは使えません。(当たり前)

そこで役立つのが Zend DOM Qery というパッケージ

もし composer を使ってるなら、次のコマンドで即導入できます。

これで vendor 以下にライブラリが作成されるはず

使うときは autoload.php  を読み込みするだけです。

 

あるいは次の GitHubページ から直DLもOK

どっちを使って導入するかは個人の好みです(composerの方が圧倒的に楽だけど、、、)

使い方1.CSSセレクタから要素リストを取得する基本手順

まずは Zend DOM Query の基本の使い方について

その箇条書きすると次の通りです。

  1. DOMオブジェクトをHTMLから作成
  2. executeメソッドにCSSセレクタ渡す
  3. 結果がノードリストとして返ってくる
  4. 値とか属性とかいろいろ取得・・・

次みたいな使い方ができます。

 

例えば次みたいなHTMLがあるとしましょう。

こういう風な同じクラス名( item  )がついてる要素

これらを一気に取得したいときに、Zend Query が便利ですね。

 

例えば次のコードを書けば、CSSセレクタからノードリスト取得できます

▼ 具体的なコード例はコチラ

▼ このコードの出力結果

まず Query オブジェクトに解析対象のHTMLを渡し、
そして div.item  みたいに普通のCSSセレクタを渡せいいだけ

セレクタにも制限はないので、jQeryとかと全く同じ感覚で使えるのも便利です。

使い方2.属性値から要素リストを取得する方法

このZend Query では、CSSセレクタに属性値も指定できます。

まあCSSセレクタを扱えるライブラリだから当たり前だけど・・・

 

あとこれが便利なのは、
正規表現 ~=  とか *=  みたいなの)も使用できるとこです。

▼ この記事で詳しく解説したやつ

これを使って属性値から要素リストとか取得できます。

 

例えば、連番になってる属性値の要素を取得したいことないですか?

CSSセレクタで正規表現を使えば、そういうのも簡単です。

▼ 具体的なコード例は次の通り

▼ このコードの実行結果

ここではid属性が a-  を "含むものだけ" で絞り込みしてます。

連番とかプレフィクスとか、そういう要素だと便利かもしれない

Zend Dom Query で要素名とか属性情報を調べるには

この Zend Dom Query で返されるノードリスト

そのノードリストは DOMElement 型で返されることに注意

Zend Query 独自のものではなくて、PHPで初めから用意されてるデータ型です。

それを使い、取得したノードの属性情報を調べる方法を最後にまとめときます。

1.属性名を調べる方法&コード例

属性名を調べるにはノードの nodeName  を参照するだけ

同名のクラスの要素名とかを調べるのに便利です。

▼ 例えば同じクラスの要素名を調べてるコード例

▼ このコードの実行結果

まあ要素名だけ取得したい、なんて場面はないですけどね・・・

でも要素名を知りたいなら、 nodeName  プロパティを参照すれば分かります。

2.属性名や属性値を調べるには

次は属性名や属性値を調べる方法について

これらは次の手順で取得可能

  1. まずノードの attributes  を参照
  2. foreach  内で属性情報を取得
  3. 属性名とか属性値の情報を調べる

属性もノードとして扱われるから、
属性名は nodeName  、属性値は nodeValue  から調べることができます。

 

▼ 具体的なコード例は次の通り

▼ このコードの実行結果

属性名とか属性値もノードとして普通に取得できます。

ただやり方が分からないと少し混乱するかも

ここまでのまとめ

一言でいうなら「Zend DOM Query 便利だよ」っていう話

便利だけど使い方を忘れそうなので、一応記事にして残りしておきます。

以上、PHPでCSSセレクタで要素解析する方法でした。ではまた!

PHP

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください