HTMLのチェックは簡単にできるようになったのですが、直すのは相変わらず手作業です。うちのひとりごとコーナーのエントリーは現在のところ2,248件。今月分のデータに関しては気になるので直しましたが、過去のデータの手直しなんかやってられません(^_^)。
手直しで多いのが <img >→<img />、<li>hoge→<li>hoge</li> だとか、<p>の閉じ忘れとか。そういう感じの間違いはある程度 機械的にできるはずなのですが、勝手にやってくれるものはないかいなと思っていたところ、HTML Tidy というのがあるそうです。で、PHPからも簡単に使えるようになっていて、/usr/ports/lang/php5-extensions で make config して TIDY を有効にして portupgrade -f してやれば使えるようになりました。
ソースファイル(PHP) | 実行結果 |
<?php $html=<<<EOF <html> <p>間違ったTidyサンプル <table border> <tr><th>thで始めてtdで終る</td><td>trを忘れる</td> </table> <a href="http://hoge.fuga/?a=1&b=2"> &の扱い <img src="hogehoge.jpg" align=right> <img>の扱い </a> <br clear="all"> <muko>無効な要素</muko> <blockquote>閉じ間違い</blockquot> <centre>開始間違い</center> <li>いきなりリスト </html> EOF; $config = array( // 'indent' => true, 'alt-text' => '###', 'output-xhtml' => true, 'wrap' => 200); $tidy = new tidy; $tidy->parseString($html,$config,'utf8'); $tidy->cleanRepair(); echo $tidy; ?> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <p>間違ったTidyサンプル</p> <table border="1"> <tr> <th>thで始めてtdで終る</th> <td>trを忘れる</td> </tr> </table> <a href="http://hoge.fuga/?a=1&b=2">&の扱い <img src="hogehoge.jpg" align="right" alt="###" /> <img>の扱い</a><br clear="all" /> 無効な要素 <blockquote>閉じ間違い 開始間違い <ul> <li>いきなりリスト</li> </ul> </blockquote> </body> </html> |
実行結果から読み取れる事項をいくつか
ということで、いろいろ試した限りでは元々のHTMLがそんなに派手に崩壊することもないみたいで、正しいHTMLが入力された場合には表示に差異はなさそうです。これを踏まえてひとりごとコーナーに実装してみたのが次の例。
$config = array(
// 'alt-text' => '###',
'output-xhtml' => true,
'indent' => true,
'wrap' => 200
);
$tidy = new tidy;
$tidy->parseString($body,$config,'utf8');
$tidy->cleanRepair();
if (preg_match(':<body>\s*\n(.*)\n\s*</body>:s',$tidy,$m)) {
$body=$m[1];
}
ひとりごとこーなーでは 記事の内容を PostgreSQL から取ってきて $body に格納したあと表示しているのですが、表示の前段で上記を挟み込むだけでHTMLの手直しができました。いやはやこれは簡単。実行時間がかかるのでは?と気になったのですが、測定してみたところその差は1/50秒ぐらいでしたので、自宅サーバで動かす分には特に問題はなさそうです。記事の作成にはWWWブラウザをフロントエンドに使ってるので、登録データを読み出す際にも同じような処理を追加。新しい記事については格納データが綺麗になるようにしました。
そもそも機械的に処理できる事項についてわざわざ表示段で修正する必要があるのかと問われると返答に困るのですが、まぁあれです、HTML Validatorで150個のエラーとか表示されたらカッコわるいぢゃないですか(笑)。
□ 関連記事