最近在开发一个小型博客系统时,我决定采用markdown文件来存储所有的文章内容。这种方式不仅方便版本控制,也让写作体验更加流畅。然而,每篇文章除了正文,还需要标题、作者、发布日期、标签等一系列元数据。最初,我尝试将这些信息存储在数据库中,但很快发现这导致了内容与元数据的分离,每次修改文章都需要同时更新文件和数据库,非常繁琐。
我希望能够像许多静态网站生成器那样,在Markdown文件的顶部嵌入一段YAML格式的元数据(也就是所谓的“YAML Front Matter”),像这样:
<pre class="brush:php;toolbar:false;">--- title: 我的第一篇博客 author: 张三 date: 2023-10-27 tags: [PHP, Composer, 开发] --- # 欢迎来到我的博客! 这是我的第一篇博客文章,使用 **Markdown** 编写。
遇到的困难是,如何用PHP代码自动识别并解析文件顶部的YAML块,将其转换为一个可操作的数组,同时将剩余的Markdown内容提取出来,并进一步渲染成html。如果手动处理,我需要:
- 读取整个文件内容。
- 通过字符串匹配或正则表达式找到
---
分隔符,将文件分割成YAML部分和Markdown部分。
- 引入一个YAML解析库(比如
symfony/yaml
)来解析YAML字符串。
- 引入一个Markdown解析库(比如
league/commonmark
)来解析Markdown字符串。
- 处理各种边界情况,例如文件没有Front Matter,或者Front Matter格式错误。
这套流程写下来既冗长又容易出错,而且每次处理文件都需要重复这些步骤,代码可读性也很差。
mnapoli/front-yaml
mnapoli/front-yaml
:你的救星!
正当我为这些繁琐的解析工作感到头疼时,我发现了
mnapoli/front-yaml
这个Composer库。它提供了一个简洁优雅的解决方案,专门用于处理带有YAML Front Matter的文档。
它的核心功能就是: 接收一个包含YAML Front Matter和Markdown内容的字符串,然后帮你自动分离并解析出YAML数据和Markdown内容(可选地将其渲染成HTML)。
安装非常简单:
<pre class="brush:php;toolbar:false;">composer require mnapoli/front-yaml
基本用法一览:
使用起来简直是小菜一碟。你只需要创建一个
Parser
实例,然后调用它的
parse()
方法即可。
<pre class="brush:php;toolbar:false;"><?php require 'vendor/autoload.php'; use MniFrontYAMLParser; $contentString = <<<EOT --- title: 如何使用Front-YAML author: 李四 date: 2023-10-28 tags: [PHP, Front Matter, Markdown] status: published --- # `mnapoli/front-yaml` 让解析变得简单 这篇文章将向你展示如何利用 `mnapoli/front-yaml` 库, 轻松地从带有 **YAML Front Matter** 的文件中提取元数据和内容。 - 步骤1:安装 - 步骤2:使用Parser - 步骤3:获取数据 EOT; $parser = new Parser(); $document = $parser->parse($contentString); // 获取YAML元数据 $yaml = $document->getYAML(); echo "--- YAML 元数据 ---n"; print_r($yaml); // 获取解析后的HTML内容 (默认会解析Markdown) $html = $document->getContent(); echo "n--- HTML 内容 ---n"; echo $html; // 如果你不想解析Markdown,可以传入 false $documentWithoutMarkdown = $parser->parse($contentString, false); $rawMarkdown = $documentWithoutMarkdown->getContent(); echo "n--- 原始 Markdown 内容 ---n"; echo $rawMarkdown;
运行上述代码,你会看到整洁的YAML数组和已经渲染成HTML的Markdown内容,简直是魔法!
<pre class="brush:php;toolbar:false;">--- YAML 元数据 --- Array ( [title] => 如何使用Front-YAML [author] => 李四 [date] => 2023-10-28 [tags] => Array ( [0] => PHP [1] => Front Matter [2] => Markdown ) [status] => published ) --- HTML 内容 --- <h1><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">mnapoli/front-yaml