LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

MarkdownをPHPでパースする(Parsedown利用)

こんにちは、株式会社ライオンハートの鵜飼です。

少し前にクライアントサイド側でMarkdownのパースを行うメモを残しておりましたが、今回は毎回クライアントサイドでパースを行うのは勿体無いので、サーバサイド側、PHPでパースを行う際のメモです。

ライブラリ選定

PHPのMarkdownパーサはPHP Markdownが一番有名でしょうか?また、同作者のMarkdownを拡張したPHP Markdown Extraというのもあるそうですね。

今回は、またもや高速で動作すると紹介されているParsedownを採用してみました。

その他PHPのMarkdownパーサ

インストール

最近のライブラリはComposerでインストール出来るようになってるので、インストールも楽ちんです。

composer require erusev/parsedown

本番環境もcomposer.jsonだけ持って行って、composer installを実行する流れでも良いかもしれませんね。

使い方

Markdownのパーサのみのライブラリなので、使い方も簡単です。
単純にパースするだけであれば、下記のように一行で実行できます。

<?php

echo Parsedown::instance()->text('# heading');

他にはnewでインスタンスを作成する方法でもOKです。

<?php

$parse = new Parsedown();
echo $parse->text( '# heading' );

設定出来るオプションは3つだけです。

改行を<br>に変換するsetBreaksEnabled

<?php

echo Parsedown::instance()
        ->setBreaksEnabled( true )
        ->text("1行目 \n 2行目");
// <p>1行目<br />2行目</p>

Markdown中のHTMLをエスケープするsetMarkupEscaped

<?php

echo Parsedown::instance()
        ->setMarkupEscaped( true )
        ->text("<div>このHTMLはエスケープされます</div>");
// <p>&lt;div&gt;&lt;このHTMLはエスケープされます&lt;/div&gt;&lt;</p>

URLを自動的にリンクテキストにするsetUrlsLinked

このオプションだけは初期値がtrueです。

<?php

echo Parsedown::instance()
        ->text("これはリンクが貼られます http://example.com/");
// <p>これはリンクが貼られます <a href="http://example.com/">http://example.com/</a></p>

echo Parsedown::instance()
        ->setUrlsLinked( false )
        ->text("これはリンクが貼られません http://example.com/");
// <p>これはリンクが貼られません http://example.com/</p>

拡張

拡張する際は、Parsedownを継承して書く形になります。

あまり詳しくは記述しませんが、例えば特定のMarkdownの記法を無効化する際はメソッドをオーバライドしてしまえば良いようです。

<?php

class MyParser extends Parsedown
{
    protected function blockHeader($Line)
    {
        return;
    }
}

詳しくは公式のWikiを参照ください。

参考サイト