PHP スクリプトが含まれている HTML 文書を HTML::TreeBuilder で処理する際のメソッドについてまとめる。PHP スクリプトには手を加えない。
HTML を処理するのに便利な HTML::TreeBuilder ではあるが,HTML 文書の中に PHP スクリプトが埋め込まれているときは注意が必要である。何も指定しなければ,PHP スクリプトは無視され,スクリプト部分は出力されない。出力させるには,HTML をパースする前に,呪文を唱える必要がある。次のコードの強調部分である。
「$tree->store_pis(1);」とすることにより,<?php ... > が process として認識され,処理されるようになる (HTML::TreeBuilder)。しかし,強調部分のうち,「$tree->store_pis(1);」だけを残し,他の2行をコメントアウトして実行すると,次の結果となる。
これはヒドイ。何が起こっているかというと,<?php でスクリプトが始まったことを認識したが,print 文の中の <p> タグの「>」をスクリプトの終わりとして認識してしまったため,対になっていない「</p>」が削除され,余った「?>」が安全でないとされて「?>」に変換されてしまっているのだ。
こうなってしまった原因は「>」がスクリプトの終了文字列だと認識されてしまったことにある。正しく「?>」を終了文字列だと認識させるには,「$tree->xml_pic(1);」の指定をすればよい。この指定を追加して実行すると,次の結果となる。
PHP スクリプト内部は正しく出力されるようになった。しかし,終了文字列が「>」で出力されてしまっている。これでは PHP のエンジンが正しくパースしてくれない。そこで,正しく「?>」で出力させるために,「$tree->handler(process => sub {$_[0]->process(substr($_[1], 2, -1));}, 'self, text');」の指定を行う。すると,メデタク次の出力が得られる。
これで,HTML に PHP スクリプトのコードが埋め込まれていても,正しくパースすることができるようになった。注意としては,PHP のコードの中のコメント行に「?>」を含めてはいけないということである。含まれている場合,HTML::TreeBuilder だけでなく PHP も混乱する。PHP も正しくパースしないのである。
HTML::TreeBuilder で構文木を作って操作する場合,次の3つのドキュメントに目を通さなければならず,量が多くてヘコタレル。
ドキュメントには例が少ないのが難点。PerlAndLWP に優れた例題がある。
HTML::TreeBuilder にはかなり嵌った。そのお陰で,Perl のことがだんだん分かってきた。
nlog(n) - ああああプラグイン もバージョンアップしておこう (使うことはないけどさ)。
Posted by n at 2008-04-12 23:55 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957