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
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
$tidy | tidy | tidy_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 ドキュメントを扱うシステムにおいて、バージョンに応じた処理分岐を実装する際に活用してください。
