DOM操作・スクレイピング用おすすめライブラリ『phpQuery』の基本的な使い方:便利で人気のjQueryのPHP実装
phpQueryとは
JavaScriptのライブラリであるjQueryをPHPで実装したもの。本家とほぼ同等の機能があり、PHPでHTML・XMLのDOMツリーの検索・操作がしやすくなる。
一部実装されていない機能もあるが、逆にjQueryにはない新規に追加された機能もある。
使い方
こちらからダウンロード。必要なファイルを1ファイルにまとめた「phpQuery-xxx-onefile.zip」がおすすめ。
もしくは、PEARでインストール。
[shell]
pear channel-discover phpquery-pear.appspot.com
pear install phpquery/phpQuery
[/shell]
まずはインクルード。
[php]
require_once 'phpQuery/phpQuery.php’;
// 1ファイル版
require_once 'phpQuery/phpQuery-onefile.php’;
[/php]
対象となるHTML・XMLをphpQuery::newDocument系の関数で読み込む。jQueryの「jQuery(document)」と同等。
返ってくるのはphpQueryオブジェクト。
[php]
$pqDoc = phpQuery::newDocument($htmlString);
[/php]
以下とほぼ同等。
[javascript]
var jqDoc = jQuery(document);
[/javascript]
phpQuery::newDocument($html, $contentType = null)
HTML・XMLのContent-typeを自動判別。判別できなかった場合はUTF-8のtext/htmlとして読み込む。
newDocumentFile($file, $contentType = null)
ファイルから直接読み込んで自動判別。
phpQuery::newDocumentHTML($html, $charset = 'utf-8’)
phpQuery::newDocumentXHTML($html, $charset = 'utf-8’)
phpQuery::newDocumentXML($html, $charset = 'utf-8’)
phpQuery::newDocumentPHP($html, $contentType = null)
PHPコードを含む文書を読み込む。
phpQuery::newDocumentFileHTML($file, $charset = 'utf-8’)
phpQuery::newDocumentFileXHTML($file, $charset = 'utf-8’)
phpQuery::newDocumentFileXML($file, $charset = 'utf-8’)
phpQuery::newDocumentFilePHP($file, $contentType)
jQuery()や$()と互換性がある関数は、「pq()」。
pq($param, $context = null);
[php]
$pqObj = pq('
');
//— 第2引数にはいろいろなものが渡せる —
// phpQueryオブジェクトそのもの
$pqObj = pq('
', $pqObj);
// phpQueryオブジェクトのドキュメントID(内部で自動生成される)
$pqObj = pq('
', $pqObj->getDocumentID());
// PHP標準APIのDOMNodeインスタンス
$pqObj = pq('
', $domNode);
[/php]
phpQueryオブジェクトは、ArrayObjectを継承しているので配列演算子 [] でセレクタを指定。
[php]
$pqDoc = phpQuery::newDocument($htmlString);
$txt = $pqDoc['div span.sample’]->text();
$pqDoc['div img’]->attr('src’, 'image.png’)->css('width’, '20%’);
[/php]
jQueryオブジェクトとは異なり、phpQueryオブジェクトは関数オブジェクトではないので注意が必要だが、あとはほとんど同じ。
phpQueryオブジェクトはあくまで配列オブジェクトなので、以下のようにループを回せる。
[php]
$pqDoc = phpQuery::newDocument($htmlString);
foreach ($pqDoc as $domNode) {
pq($domNode)->find('div’);
}
[/php]
#each()も、もちろんある。
[php]
$pqDoc = phpQuery::newDocument($htmlString);
$pqDoc->each(callback);
function callback($domNode) {
$html = pq($domNode)->html();
}
[/php]
いずれもjQueryと同じく、phpQueryオブジェクトではなく標準のDOMNodeオブジェクトが返ってくる。
手軽にプラグインをつくる機構も用意されている。
提供されているプラグインの中には、JSONを扱うための「JSON Plugin」もある。
[php]
$jsonString = phpQuery::toJSON( pq('form’)->serializeArray() );
$array = phpQuery::parseJSON('{“foo": “bar"}’);
[/php]