ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

HTMLタグがちゃんと閉じてるかどうかだけをチェックするやつ書いた

かるぱねるらさんの「HTMLのバリデーションをよしなにやりたくてHTML::Lint::Pluggable書いた - Perl Advent Calendar Japan 2012 Hacker Track」を見て、そういえば書きかけのHTMLなんとかあったと思いだしたのでとりあえずそれっぽくした。

既存のモジュールでHTMLタグが閉じてるか開きタグがないかとかカジュアルにチェックするようなやつないかなと探しててHTML::Lintとかも見つけたんですが、マルチバイト入ってるだけでいらんエラー出したりしてカジュアルに使うには色々めんどくさそうだった。

というわけで既存モジュールでありそうだったけど見つからなかったのでHTML::Lint::ParserをみつつHTMLタグが閉じてるかどうかだけをチェックするやつ書いた。

dameninngenn/p5-HTML-Validate-Structure-Simple · GitHub

そう、名前どうしようかってのをずっと悩んでて、Lintもちょっと違う気がするしValidationっつってもなんかアレだしってことで一旦適当な感じで名前つけてそのままです。良い名前つけてくれる人いませんか。。。

使い方

use HTML::Validate::Structure::Simple;

my $v = HTML::Validate::Structure::Simple->new();
$v->parse( $html );

if( not $v->is_valid ) {
    for my $error ( $v->errors ) {
        warn $error->as_string;
    }
}

$v->clear();

parseにチェックしたいHTMLを渡すと、エラーがなければis_validは1を返してそうでなければ0が返ってきます。
で、エラーがあればerrorsがarrayでerrorオブジェクトを返してきます。

errorオブジェクトはas_stringを使うと

(265:138) span is unopened.

みたいな感じでどのタグが閉じてないか開きタグがないか返してくれます。
もしくは $error->tag, $error->type, $error->line, $error->column で個別に値もとれます。

errorsを空っぽにしたい時はclear()を使えば空っぽになります。

imgとかinputみたいな閉じタグがないやつは HTML::Tagset の emptyElement を見て判断してます。

はい

タグが閉じてるかどうかしか見てないので、hoge みたいな存在しないタグでも対応とれてさえすればエラーにはなりません。

色々ちゃんとやりたい場合はHTML::Lintとか上述したHTML::Lint::Pluggableとかがいいのではないでしょうか。

というか探しきれなかっただけで同じことする既存モジュールありそうな気がする。