DOM操作・スクレイピング用おすすめライブラリ『phpQuery』の基本的な使い方:便利で人気のjQueryのPHP実装

2013 年 3 月 6 日 Categories: jQuery, PHP | Tags:

phpQueryとは

JavaScriptのライブラリであるjQueryをPHPで実装したもの。本家とほぼ同等の機能があり、PHPでHTML・XMLのDOMツリーの検索・操作がしやすくなる。

一部実装されていない機能もあるが、逆にjQueryにはない新規に追加された機能もある。

使い方

こちらからダウンロード。必要なファイルを1ファイルにまとめた「phpQuery-xxx-onefile.zip」がおすすめ。

もしくは、PEARでインストール。

pear channel-discover phpquery-pear.appspot.com  
pear install phpquery/phpQuery

まずはインクルード。

require_once 'phpQuery/phpQuery.php';
// 1ファイル版
require_once 'phpQuery/phpQuery-onefile.php';

対象となるHTML・XMLをphpQuery::newDocument系の関数で読み込む。jQueryの「jQuery(document)」と同等。

返ってくるのはphpQueryオブジェクト。

$pqDoc = phpQuery::newDocument($htmlString);

以下とほぼ同等。

var jqDoc = jQuery(document);

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);

$pqObj = pq('<div>sample</div>');

//--- 第2引数にはいろいろなものが渡せる ---
// phpQueryオブジェクトそのもの
$pqObj = pq('<div>sample</div>', $pqObj);

// phpQueryオブジェクトのドキュメントID(内部で自動生成される)
$pqObj = pq('<div>sample</div>', $pqObj->getDocumentID());

// PHP標準APIのDOMNodeインスタンス
$pqObj = pq('<div>sample</div>', $domNode);

phpQueryオブジェクトは、ArrayObjectを継承しているので配列演算子 [] でセレクタを指定。

$pqDoc = phpQuery::newDocument($htmlString);
$txt = $pqDoc['div span.sample']->text();
$pqDoc['div img']->attr('src', 'image.png')->css('width', '20%');

jQueryオブジェクトとは異なり、phpQueryオブジェクトは関数オブジェクトではないので注意が必要だが、あとはほとんど同じ。

phpQueryオブジェクトはあくまで配列オブジェクトなので、以下のようにループを回せる。

$pqDoc = phpQuery::newDocument($htmlString);

foreach ($pqDoc as $domNode) {
	pq($domNode)->find('div');
}

#each()も、もちろんある。

$pqDoc = phpQuery::newDocument($htmlString);
$pqDoc->each(callback);

function callback($domNode) {
	$html = pq($domNode)->html();
}

いずれもjQueryと同じく、phpQueryオブジェクトではなく標準のDOMNodeオブジェクトが返ってくる。

手軽にプラグインをつくる機構も用意されている。

提供されているプラグインの中には、JSONを扱うための「JSON Plugin」もある。

$jsonString = phpQuery::toJSON( pq('form')->serializeArray() );
$array = phpQuery::parseJSON('{"foo": "bar"}');