[PHP]tidy_get_release完全解説|Tidyライブラリのリリース日付を取得して環境情報を管理する方法

PHP

1. 関数概要

tidy_get_release は、PHP の Tidy 拡張が使用している Tidy ライブラリ自体のリリース日付を文字列で返す関数です。PHP のバージョンではなく、背後で動作している libtidy のビルド日時を取得できるため、環境情報の記録・デバッグ・バージョン依存処理の切り替えなどに活用できます。

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

2. 構文

// 手続き型
tidy_get_release(): string

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

パラメータ

この関数はパラメータを取りません(手続き型・OOP 型ともに引数なし)。

戻り値

Tidy ライブラリ(libtidy)のリリース日付を表す文字列。形式は環境・ビルドによって異なりますが、多くの場合 "1st August 2023" のような英語の日付文字列が返ります。


3. 動作概念図

┌──────────────────────────────────────────────────────────┐
│  PHP スクリプト                                           │
│  tidy_get_release()                                       │
└─────────────────────┬────────────────────────────────────┘
                      │ Tidy 拡張経由で libtidy に問い合わせ
                      ▼
┌──────────────────────────────────────────────────────────┐
│  libtidy(Tidy ライブラリ本体)                           │
│  ┌──────────────────────────────────────────────────┐    │
│  │ ビルド時に埋め込まれたリリース日付文字列          │    │
│  │ 例: "1st August 2023"                            │    │
│  └──────────────────────────────────────────────────┘    │
└─────────────────────┬────────────────────────────────────┘
                      │
                      ▼
┌──────────────────────────────────────────────────────────┐
│  戻り値: string                                           │
│  "1st August 2023"                                        │
└──────────────────────────────────────────────────────────┘

※ tidy オブジェクトの生成・HTML の解析は不要
  (引数なしで任意のタイミングで呼び出せる)

4. 基本的な使い方

<?php
// 引数不要・オブジェクト生成不要でそのまま呼び出せる
$release = tidy_get_release();
echo "Tidy ライブラリのリリース日付: " . $release . PHP_EOL;
// 出力例: Tidy ライブラリのリリース日付: 1st August 2023

5. 実践的なコード例

例1: 環境情報をまとめて表示するクラス

<?php
class TidyEnvironmentInfo
{
    public function getRelease(): string
    {
        return tidy_get_release();
    }

    public function getPhpTidyVersion(): string
    {
        return phpversion('tidy') ?: '不明';
    }

    public function printAll(): void
    {
        echo "=== Tidy 環境情報 ===" . PHP_EOL;
        echo "libtidy リリース日付 : " . $this->getRelease()       . PHP_EOL;
        echo "PHP tidy 拡張バージョン: " . $this->getPhpTidyVersion() . PHP_EOL;
        echo "PHP バージョン        : " . PHP_VERSION               . PHP_EOL;
        echo "OS                    : " . PHP_OS                    . PHP_EOL;
    }
}

$info = new TidyEnvironmentInfo();
$info->printAll();

出力例:

=== Tidy 環境情報 ===
libtidy リリース日付 : 1st August 2023
PHP tidy 拡張バージョン: 8.2.0
PHP バージョン        : 8.2.10
OS                    : Linux

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

<?php
class TidyOopReleaseChecker
{
    private tidy $tidy;

    public function __construct()
    {
        $this->tidy = new tidy();
        $this->tidy->parseString('<html><body></body></html>', [], 'UTF8');
    }

    public function getRelease(): string
    {
        return $this->tidy->getRelease();
    }

    public function describe(): void
    {
        echo "OOP スタイルで取得したリリース日付: " . $this->getRelease() . PHP_EOL;
    }
}

$checker = new TidyOopReleaseChecker();
$checker->describe();

出力例:

OOP スタイルで取得したリリース日付: 1st August 2023

例3: リリース日付をパースして年・月・日に分解するクラス

<?php
class TidyReleaseDateParser
{
    private string $raw;

    public function __construct()
    {
        $this->raw = tidy_get_release();
    }

    public function getRaw(): string
    {
        return $this->raw;
    }

    public function toDateTime(): ?\DateTimeImmutable
    {
        // 例: "1st August 2023", "14th November 2022" などに対応
        $normalized = preg_replace('/(\d+)(st|nd|rd|th)/', '$1', $this->raw);
        if ($normalized === null) {
            return null;
        }
        $dt = \DateTimeImmutable::createFromFormat('j F Y', trim($normalized));
        return $dt ?: null;
    }

    public function getYear(): ?int
    {
        return $this->toDateTime()?->format('Y') !== null
            ? (int) $this->toDateTime()->format('Y')
            : null;
    }

    public function describe(): void
    {
        $dt = $this->toDateTime();
        echo "生のリリース文字列 : " . $this->raw . PHP_EOL;
        if ($dt !== null) {
            echo "年                 : " . $dt->format('Y') . PHP_EOL;
            echo "月                 : " . $dt->format('F') . PHP_EOL;
            echo "日                 : " . $dt->format('j')  . PHP_EOL;
            echo "ISO 8601 形式      : " . $dt->format('Y-m-d') . PHP_EOL;
        } else {
            echo "日付のパースに失敗しました。" . PHP_EOL;
        }
    }
}

$parser = new TidyReleaseDateParser();
$parser->describe();

出力例:

生のリリース文字列 : 1st August 2023
年                 : 2023
月                 : August
日                 : 1
ISO 8601 形式      : 2023-08-01

例4: リリース日付をログに記録するクラス

<?php
class TidyReleaseLogger
{
    public function __construct(private readonly string $logFile) {}

    public function log(): void
    {
        $release = tidy_get_release();
        $line    = sprintf(
            "[%s] libtidy release: %s | PHP: %s | OS: %s\n",
            date('Y-m-d H:i:s'),
            $release,
            PHP_VERSION,
            PHP_OS
        );
        file_put_contents($this->logFile, $line, FILE_APPEND);
        echo $line;
    }
}

$logger = new TidyReleaseLogger('/tmp/tidy_release.log');
$logger->log();

出力例:

[2026-07-09 12:00:00] libtidy release: 1st August 2023 | PHP: 8.2.10 | OS: Linux

例5: リリース年が古すぎる場合に警告を出すクラス

<?php
class TidyVersionGuard
{
    private const MINIMUM_YEAR = 2020;

    private string $release;

    public function __construct()
    {
        $this->release = tidy_get_release();
    }

    private function extractYear(): ?int
    {
        if (preg_match('/\d{4}/', $this->release, $m)) {
            return (int) $m[0];
        }
        return null;
    }

    public function check(): void
    {
        $year = $this->extractYear();

        echo "libtidy リリース: " . $this->release . PHP_EOL;

        if ($year === null) {
            echo "⚠️  リリース年を特定できませんでした。" . PHP_EOL;
            return;
        }

        if ($year < self::MINIMUM_YEAR) {
            echo "❌ libtidy が古い可能性があります({$year}年)。"
               . self::MINIMUM_YEAR . "年以降のバージョンへの更新を推奨します。" . PHP_EOL;
        } else {
            echo "✅ libtidy のバージョンは問題ありません({$year}年)。" . PHP_EOL;
        }
    }
}

$guard = new TidyVersionGuard();
$guard->check();

出力例(最新環境):

libtidy リリース: 1st August 2023
✅ libtidy のバージョンは問題ありません(2023年)。

出力例(古い環境):

libtidy リリース: 25th March 2013
❌ libtidy が古い可能性があります(2013年)。2020年以降のバージョンへの更新を推奨します。

例6: 環境情報を JSON で出力するクラス

<?php
class TidyEnvJsonExporter
{
    public function export(): string
    {
        $tidy    = tidy_parse_string('<html><body></body></html>', [], 'UTF8');
        tidy_clean_repair($tidy);

        $data = [
            'tidy' => [
                'release'        => tidy_get_release(),
                'html_ver'       => tidy_get_html_ver($tidy),
                'status'         => tidy_get_status($tidy),
                'php_extension'  => phpversion('tidy') ?: null,
            ],
            'php' => [
                'version'        => PHP_VERSION,
                'os'             => PHP_OS,
                'sapi'           => PHP_SAPI,
            ],
            'generated_at' => date('c'),
        ];

        return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    }
}

$exporter = new TidyEnvJsonExporter();
echo $exporter->export();

出力例:

{
    "tidy": {
        "release": "1st August 2023",
        "html_ver": 0,
        "status": 0,
        "php_extension": "8.2.0"
    },
    "php": {
        "version": "8.2.10",
        "os": "Linux",
        "sapi": "cli"
    },
    "generated_at": "2026-07-09T12:00:00+09:00"
}

例7: リリース日付に基づいて処理を切り替えるクラス

<?php
class TidyVersionAwareProcessor
{
    private ?int $releaseYear;

    public function __construct()
    {
        $release = tidy_get_release();
        preg_match('/\d{4}/', $release, $m);
        $this->releaseYear = isset($m[0]) ? (int) $m[0] : null;
    }

    public function process(string $html): string
    {
        $config = $this->buildConfig();
        $tidy   = tidy_parse_string($html, $config, 'UTF8');
        tidy_clean_repair($tidy);
        return tidy_get_output($tidy);
    }

    private function buildConfig(): array
    {
        // 2020年以降の libtidy では HTML5 doctype が安定してサポートされる
        if ($this->releaseYear !== null && $this->releaseYear >= 2020) {
            echo "✅ 新しい libtidy ({$this->releaseYear}年): HTML5 モードで処理します。" . PHP_EOL;
            return ['indent' => true, 'doctype' => 'html5', 'wrap' => 80];
        }

        echo "⚠️  古い libtidy: 互換モード(HTML 4.01)で処理します。" . PHP_EOL;
        return ['indent' => true, 'doctype' => 'loose', 'wrap' => 80];
    }
}

$processor = new TidyVersionAwareProcessor();
$output    = $processor->process('<html><body><p>バージョン対応サンプル</p></body></html>');
echo $output;

出力例(新しい libtidy):

✅ 新しい libtidy(2023年): HTML5 モードで処理します。
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <p>バージョン対応サンプル</p>
</body>
</html>

6. 関連関数との比較

関数名用途戻り値引数
tidy_get_release()libtidy のリリース日付を取得stringなし
tidy_get_html_ver()解析済み HTML のバージョン番号を取得inttidy オブジェクト
tidy_get_status()解析結果のステータスを取得inttidy オブジェクト
tidy_get_output()整形済み HTML を文字列で取得stringtidy オブジェクト
tidy_get_error_buffer()エラーバッファの内容を取得string|falsetidy オブジェクト
tidy_get_opt_doc()オプションの説明文字列を取得string|falsetidy オブジェクト, string
phpversion('tidy')PHP tidy 拡張のバージョンを取得string|falsestring

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

① 返される文字列の形式は環境依存

tidy_get_release() の戻り値は libtidy のビルド時に埋め込まれた文字列であり、形式が統一されていません。"1st August 2023" のような英語序数形式が一般的ですが、環境によって異なる場合があります。パースする際は柔軟な正規表現を使いましょう。

// 年だけ抽出する(形式に依存しない安全な方法)
preg_match('/\d{4}/', tidy_get_release(), $m);
$year = (int) ($m[0] ?? 0);

② PHP の tidy 拡張バージョンとは別物

tidy_get_release()libtidy ライブラリのリリース日付であり、PHP の tidy 拡張モジュールのバージョン(phpversion('tidy') で取得)とは異なります。混同しないよう注意してください。

echo tidy_get_release();       // libtidy のリリース日付(例: "1st August 2023")
echo phpversion('tidy');       // PHP tidy 拡張のバージョン(例: "8.2.0")

③ tidy オブジェクトの生成は不要

tidy_get_release() は手続き型では引数不要、OOP 版でも tidy インスタンスさえあれば HTML の解析前でも呼び出せます。tidy_parse_string()tidy_clean_repair() を事前に実行する必要はありません。

// OK: オブジェクト生成直後に呼べる
$tidy = new tidy();
echo $tidy->getRelease(); // HTML 解析前でも動作する

// OK: 手続き型はオブジェクト不要
echo tidy_get_release();

④ Tidy 拡張が無効な環境では呼び出せない

他の Tidy 関数と同様、extension_loaded('tidy') で拡張の有無を確認してから使用してください。

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

8. まとめ

項目内容
主な用途libtidy ライブラリのリリース日付を取得する
戻り値string(例: "1st August 2023"
引数なし(手続き型)/ tidy インスタンス(OOP 版)
OOP 版$tidy->getRelease()
HTML 解析の事前実行不要
注意点戻り値の形式は環境依存・PHP 拡張バージョンとは別物
よく使う組み合わせphpversion('tidy'), tidy_get_html_ver(), tidy_get_status()

tidy_get_release() は引数不要で手軽に呼び出せるシンプルな関数ですが、libtidy の世代を判定してバージョン依存の処理を切り替える用途や、環境情報のログ・エクスポートに実用的です。tidy_get_html_ver()tidy_get_output() など他の Tidy 関数と組み合わせて、環境情報を一括管理するユーティリティクラスに組み込むと便利です。

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