prototype.js script.aculo.us 何かを使っていると、getElementsByTagName() なんかをphpで使えたらHTML解析とか簡単だなぁーって思っていました。
そうこうしているうちに、symfonyのフォームのrepopulationで使うsfFillInFormFilter.class.phpの存在に気づきました。
http://www.symfony-project.com/book/trunk/fillin
※repopulationとは、フォーム要素への入力値再割り当て?で、要はエラー表示なんかする時に、元々の入力値を要素にデフォルトで表示するようなことです。(一般的ですが、コーディングはライブラリ無しではかなり辛いやつです)
HTML_QuickFormでもライブラリ内でさんざん手を焼いていたものですが、ここではDomDocumentやらDomXPathやらPHP5ならではの機能を使っています。
- sfFillInFormFilter.class.php
http://www.symfony-project.com/trac/browser/trunk/lib/filter/sfFillInFormFilter.class.php - DomDocument DomXPath などPHPのドキュメント
http://jp.php.net/manual/ja/ref.dom.php - 第16回 XSLT を使って、HTML ファイルを出力する(参考になるかも)
http://jx-study.net/Xphp/Xphp016.html - XPath Tutorial
http://www.zvon.org/xxl/XPathTutorial/General/examples.html
この手法を応用すると、HTTP_Clientなんかで取ってきたHTMLをPHPで簡単に解析できたりします。
ここで一つ注意しないとはまってしまうのは、エンコーディングです。
$document = new DomDocument('1.0', 'UTF-8');
$document->loadHTML($html);
とUTF-8宣言でやっていても、読み込むHTMLのmetaのContent-Typeが定かでないとどうも文字化けしてしまいます。なので、エンコーディングの指定が必要な場合は特に、読み込ませる元となるHTMLのmetaタグ(Content-Type)の内容まで確認しておきましょう。
//自分の場合ですが、元ネタにContent-Typeすらなかったので追加してるサンプル
//$html はUTF-8です
$html = preg_replace('/<title>/i', '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>', $html);


