[PHP]tidy_get_html_ver完全解説|HTMLバージョンを取得してドキュメント解析の精度を高める方法

PHP

1. 関数概要

tidy_get_html_ver は、PHP の Tidy 拡張が解析した HTML ドキュメントが準拠している HTML バージョン番号を整数値で返す関数です。Tidy ライブラリが内部的に判定したバージョン情報を取得できるため、ドキュメントの種類に応じた条件分岐や検証ロジックを実装する際に役立ちます。

項目内容
関数名tidy_get_html_ver
所属拡張Tidy
戻り値の型int
手続き型 / OOP手続き型(tidy::getHtmlVer() がOOP版)
PHP バージョンPHP 5 以降
公式ドキュメントhttps://www.php.net/manual/ja/tidy.gethtmlver.php

2. 構文

// 手続き型
tidy_get_html_ver(tidy $tidy): int

// オブジェクト指向型
$tidy->getHtmlVer(): int

パラメータ

パラメータ説明
$tidytidytidy_parse_string()tidy_parse_file() で生成した tidy オブジェクト

戻り値

Tidy が判定した HTML バージョンを表す整数値。値の意味は Tidy ライブラリの内部定義に依存します(例: 0 は不明、正の整数は検出バージョン)。


3. 動作概念図

┌─────────────────────────────────────────────────────────┐
│  HTML ソース文字列 / ファイル                            │
│  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" ...> │
└────────────────────┬────────────────────────────────────┘
                     │ tidy_parse_string() / tidy_parse_file()
                     ▼
┌─────────────────────────────────────────────────────────┐
│  Tidy 解析エンジン                                       │
│  ┌─────────────────────────────┐                        │
│  │ DOCTYPE 検出                 │                        │
│  │ 構文検査                     │  ← HTML 種別を判定    │
│  │ バージョン推定               │                        │
│  └─────────────────────────────┘                        │
└────────────────────┬────────────────────────────────────┘
                     │ tidy_get_html_ver()
                     ▼
┌─────────────────────────────────────────────────────────┐
│  戻り値: int (HTMLバージョン番号)                        │
│  例: 0 = 不明 / HTML5, 400 = HTML 4.00, 401 = HTML 4.01│
└─────────────────────────────────────────────────────────┘

4. 基本的な使い方

<?php
// Tidy 拡張が有効であることを確認
$html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
         "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>サンプルページ</title></head>
<body><p>こんにちは</p></body>
</html>';

$tidy = tidy_parse_string($html, [], 'UTF8');

$version = tidy_get_html_ver($tidy);
echo "HTMLバージョン番号: " . $version . PHP_EOL;
// 出力例: HTMLバージョン番号: 401

5. 実践的なコード例

例1: HTMLバージョンを取得して表示するクラス

<?php
class HtmlVersionDetector
{
    private tidy $tidy;

    public function __construct(string $html)
    {
        $this->tidy = tidy_parse_string($html, [], 'UTF8');
    }

    public function getVersion(): int
    {
        return tidy_get_html_ver($this->tidy);
    }

    public function report(): void
    {
        echo "検出された HTML バージョン番号: " . $this->getVersion() . PHP_EOL;
    }
}

$html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
         "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>Test</title></head><body><p>Hello</p></body></html>';

$detector = new HtmlVersionDetector($html);
$detector->report();

出力例:

検出された HTML バージョン番号: 401

例2: OOP スタイルで getHtmlVer() を使う

<?php
class TidyAnalyzer
{
    private tidy $tidy;

    public function __construct(string $html, array $config = [])
    {
        $this->tidy = new tidy();
        $this->tidy->parseString($html, $config, 'UTF8');
        $this->tidy->cleanRepair();
    }

    public function getHtmlVersion(): int
    {
        return $this->tidy->getHtmlVer();
    }

    public function describe(): string
    {
        $ver = $this->getHtmlVersion();
        return match(true) {
            $ver === 0   => "HTML5 または不明",
            $ver === 400 => "HTML 4.00",
            $ver === 401 => "HTML 4.01",
            $ver === 200 => "HTML 2.0",
            $ver === 320 => "HTML 3.2",
            default      => "バージョン番号: {$ver}",
        };
    }
}

$html = '<html><head><title>Modern</title></head><body><p>HTML5</p></body></html>';
$analyzer = new TidyAnalyzer($html);
echo $analyzer->describe() . PHP_EOL;

出力例:

HTML5 または不明

例3: バージョンに応じて処理を切り替えるクラス

<?php
class HtmlVersionRouter
{
    private int $version;

    public function __construct(string $html)
    {
        $tidy = tidy_parse_string($html, [], 'UTF8');
        $this->version = tidy_get_html_ver($tidy);
    }

    public function process(): void
    {
        if ($this->version === 401) {
            $this->processHtml401();
        } elseif ($this->version === 0) {
            $this->processHtml5();
        } else {
            $this->processLegacy();
        }
    }

    private function processHtml401(): void
    {
        echo "HTML 4.01 用の厳密なバリデーションを適用します。" . PHP_EOL;
    }

    private function processHtml5(): void
    {
        echo "HTML5 用のセマンティック解析を適用します。" . PHP_EOL;
    }

    private function processLegacy(): void
    {
        echo "レガシー HTML (バージョン: {$this->version}) の互換処理を適用します。" . PHP_EOL;
    }
}

$html4 = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><body><p>HTML4</p></body></html>';

$router = new HtmlVersionRouter($html4);
$router->process();

出力例:

HTML 4.01 用の厳密なバリデーションを適用します。

例4: 複数のHTMLドキュメントのバージョンを一括チェック

<?php
class BulkHtmlVersionChecker
{
    /** @var array<string, string> */
    private array $documents;

    public function __construct(array $documents)
    {
        $this->documents = $documents;
    }

    public function checkAll(): void
    {
        foreach ($this->documents as $name => $html) {
            $tidy    = tidy_parse_string($html, [], 'UTF8');
            $version = tidy_get_html_ver($tidy);
            printf("%-20s => バージョン番号: %d%s", $name, $version, PHP_EOL);
        }
    }
}

$docs = [
    'HTML 2.0 Doc'  => '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><body>Hi</body></html>',
    'HTML 4.01 Doc' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><body>Hi</body></html>',
    'HTML5 Doc'     => '<!DOCTYPE html><html><body><p>HTML5</p></body></html>',
];

$checker = new BulkHtmlVersionChecker($docs);
$checker->checkAll();

出力例:

HTML 2.0 Doc         => バージョン番号: 200
HTML 4.01 Doc        => バージョン番号: 401
HTML5 Doc            => バージョン番号: 0

例5: エラーハンドリング付きバージョン検出クラス

<?php
class SafeHtmlVersionDetector
{
    private ?tidy $tidy = null;
    private string $lastError = '';

    public function parse(string $html): bool
    {
        try {
            $this->tidy = tidy_parse_string($html, [], 'UTF8');
            return $this->tidy !== false;
        } catch (\Throwable $e) {
            $this->lastError = $e->getMessage();
            return false;
        }
    }

    public function getVersion(): ?int
    {
        if ($this->tidy === null) {
            return null;
        }
        return tidy_get_html_ver($this->tidy);
    }

    public function getLastError(): string
    {
        return $this->lastError;
    }
}

$detector = new SafeHtmlVersionDetector();

if ($detector->parse('<html><body>Test</body></html>')) {
    $ver = $detector->getVersion();
    echo "バージョン: " . ($ver ?? '取得失敗') . PHP_EOL;
} else {
    echo "解析エラー: " . $detector->getLastError() . PHP_EOL;
}

出力例:

バージョン: 0

例6: バージョン情報をログファイルに記録するクラス

<?php
class HtmlVersionLogger
{
    private string $logFile;

    public function __construct(string $logFile)
    {
        $this->logFile = $logFile;
    }

    public function log(string $label, string $html): void
    {
        $tidy    = tidy_parse_string($html, [], 'UTF8');
        $version = tidy_get_html_ver($tidy);
        $line    = sprintf(
            "[%s] %s => HTML バージョン番号: %d\n",
            date('Y-m-d H:i:s'),
            $label,
            $version
        );
        file_put_contents($this->logFile, $line, FILE_APPEND);
        echo $line;
    }
}

$logger = new HtmlVersionLogger('/tmp/html_version.log');
$logger->log('ページA', '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><html><body>A</body></html>');
$logger->log('ページB', '<!DOCTYPE html><html><body>B</body></html>');

出力例:

[2026-07-09 12:00:00] ページA => HTML バージョン番号: 401
[2026-07-09 12:00:00] ページB => HTML バージョン番号: 0

例7: バージョン別レポートを生成するクラス

<?php
class HtmlVersionReporter
{
    /** @var array<int, int> */
    private array $versionCounts = [];

    public function add(string $html): void
    {
        $tidy    = tidy_parse_string($html, [], 'UTF8');
        $version = tidy_get_html_ver($tidy);
        $this->versionCounts[$version] = ($this->versionCounts[$version] ?? 0) + 1;
    }

    public function printReport(): void
    {
        arsort($this->versionCounts);
        echo "=== HTML バージョン集計レポート ===" . PHP_EOL;
        foreach ($this->versionCounts as $ver => $count) {
            $label = $ver === 0 ? "HTML5/不明" : "バージョン {$ver}";
            printf("%-20s : %d 件%s", $label, $count, PHP_EOL);
        }
    }
}

$reporter = new HtmlVersionReporter();
$reporter->add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><html><body>A</body></html>');
$reporter->add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><html><body>B</body></html>');
$reporter->add('<!DOCTYPE html><html><body>C</body></html>');
$reporter->add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html><body>D</body></html>');
$reporter->printReport();

出力例:

=== HTML バージョン集計レポート ===
バージョン 401       : 2 件
HTML5/不明           : 1 件
バージョン 320       : 1 件

6. 関連関数との比較

関数名用途戻り値
tidy_get_html_ver()解析済みHTMLのバージョン番号取得int
tidy_get_release()Tidy ライブラリ自体のリリース日付取得string
tidy_get_status()解析結果のステータス(警告・エラー)取得int
tidy_get_output()クリーニング後の HTML 文字列取得string
tidy_get_error_buffer()エラーバッファの内容を取得string|false
tidy_parse_string()HTML 文字列を解析して tidy オブジェクト生成tidy|false
tidy_parse_file()HTML ファイルを解析して tidy オブジェクト生成tidy|false

7. よくある落とし穴と注意点

① HTML5 のバージョン番号は 0 になる

HTML5 の <!DOCTYPE html> は従来の DOCTYPE 宣言とは異なり、バージョン情報を持ちません。そのため tidy_get_html_ver()0 を返します。0 を「解析失敗」と誤解しないよう注意してください。

// NG: 0 をエラーとして扱う
if (tidy_get_html_ver($tidy) === 0) {
    echo "エラー"; // HTML5 でも 0 が返る
}

// OK: 0 を HTML5/不明として扱う
$ver = tidy_get_html_ver($tidy);
$label = $ver === 0 ? "HTML5 または不明" : "HTML バージョン: {$ver}";
echo $label;

② tidy オブジェクトを先に生成する必要がある

tidy_get_html_ver() は必ず tidy_parse_string()tidy_parse_file() で生成した有効な tidy オブジェクトを渡してください。

// NG: 未解析オブジェクト
$tidy = new tidy();
tidy_get_html_ver($tidy); // 未解析なので不定

// OK: 解析後に呼び出す
$tidy = tidy_parse_string($html, [], 'UTF8');
$version = tidy_get_html_ver($tidy);

③ Tidy 拡張が有効でない環境では使えない

extension_loaded('tidy') で拡張が有効かどうか確認してから使用しましょう。

if (!extension_loaded('tidy')) {
    throw new \RuntimeException('Tidy 拡張が有効ではありません');
}

8. まとめ

項目内容
主な用途Tidy が解析した HTML のバージョン番号取得
戻り値int(0: HTML5/不明, 200: HTML 2.0, 320: HTML 3.2, 400: HTML 4.00, 401: HTML 4.01)
HTML5 の場合0 が返る(エラーではない)
OOP 版$tidy->getHtmlVer()
注意点解析前の tidy オブジェクトに対して呼び出すと不定値になる
組み合わせる関数tidy_parse_string(), tidy_get_status(), tidy_get_output()

tidy_get_html_ver() は、解析対象の HTML がどのバージョン規格に基づいているかをプログラム的に判定できる便利な関数です。特にレガシーシステムや複数世代の HTML ドキュメントを扱うシステムにおいて、バージョンに応じた処理分岐を実装する際に活用してください。

タイトルとURLをコピーしました