CakePHP 4 で HTML To Markdown for PHP を使って HTML を Markdown に変換する方法

はじめに

昨日の「CakePHP 4 で Markdown を HTML に変換し behavior を使って効率的に保存するアイディア」では Markdown を HTML に変換するサンプルをご紹介しましたが、今日は逆に CakePHP 4 で HTML を Markdown に変換する方法をご紹介します。

CakePHP
4.0.3
HTML To Markdown for PHP
4.9.1
目次
  1. インストール
  2. 実装方法
  3. <h1>、<h2> を #、## にする
  4. 不要なタグを削除
  5. おわりに

1. インストール

HTML To Markdown for PHP は README にある通り composer でインストールします。

> cd \path\to\cakephp4
> composer require league/html-to-markdown

2. 実装方法

公式の README を参考にしてコントローラに実装しました。

/src/Controller/SampleController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use League\HTMLToMarkdown\HtmlConverter; // ← 追加

class SampleController extends AppController
{
  public function index()
  {
    $converter = new HtmlConverter();
    $html = "<h1>こんにちは、世界!</h1>\n"
          . "<h2>Hello, world</h2>\n"
          . "<p>これはサンプルです</p>\n";
    $markdown = $converter->convert($html);
    debug($markdown);
    exit;
  }
}

3. <h1>、<h2> を #、## にする

先の紹介したサンプルの実行結果は下記になります。

こんにちは、世界!
=========

Hello, world
------------

これはサンプルです

<h1>、<h2> を #、## に変換するには header_style オプションを追加します。

/src/Controller/SampleController.php
public function index()
{
  $converter = new HtmlConverter(['header_style' => 'atx']); ← 変更
  ...
}
# こんにちは、世界!

## Hello, world

これはサンプルです

4. 不要なタグを削除

例えば <span> タグなどが入っていると、そのまま出力されてしまいます。そういった不要なタグを取り除くには strip_tags オプションを使います。

/src/Controller/SampleController.php
public function index()
{
  $converter = new HtmlConverter([
    'header_style' => 'atx',
    'strip_tags' => true, // ← 追加、これがないと span タグがそのまま出力される
  ]);
  $html = "<h1>こんにちは、世界!</h1>\n"
        . "<h2>Hello, world</h2>\n"
        . "<p>これは<span>サンプル</span>です</p>\n"; // ← span タグ追加
  $markdown = $converter->convert($html);
  debug($markdown);
  exit;
}

5. おわりに

今日ご紹介した方法は、既存の CMS や ブログ で投稿された HTML を Markdown にコンバートするのに使えそうです。

Html to markdown には他にもオプションがあり、公式ドキュメントで紹介されています。英語なのでちょっと敷居が高いかもしれませんが、簡潔に説明されていますので興味のある方にはご確認いただければと思います。