当前位置: 首页> 最新文章列表> 用 preg_replace_callback_array 替换 Markdown 标记为 HTML

用 preg_replace_callback_array 替换 Markdown 标记为 HTML

M66 2025-06-02

在 PHP 中,preg_replace_callback_array 是一个强大的正则表达式函数,它可以帮助我们将匹配到的正则表达式结果交给一个回调函数进行处理,从而动态替换字符串内容。这个函数在处理像 Markdown 这样的文本转换时非常有用。Markdown 是一种轻量级的标记语言,常用于格式化文本内容,尤其在生成 HTML 页面的过程中,Markdown 转换为 HTML 是一个常见的需求。

本文将介绍如何使用 preg_replace_callback_array 函数将 Markdown 标记替换为 HTML 代码,特别是在处理 URL 中的域名替换时,我们将所有 URL 的域名替换为 m66.net

准备工作

首先,我们要处理 Markdown 中常见的标记,例如链接、粗体、斜体等,并将它们转换为 HTML 标记。我们可以通过 preg_replace_callback_array 来匹配并替换这些 Markdown 标记。

1. 替换链接

Markdown 中的链接格式为 [链接文本](url),我们需要将它转换为 HTML 的 <a> 标签。为了演示替换,我们将 URL 的域名部分替换为 m66.net

$markdown_text = "[Google](https://www.google.com) 和 [Bing](https://www.bing.com) 是常见的搜索引擎。";

// 替换 URL 域名为 m66.net 的回调函数
function replace_url_domain($matches) {
    // 将 URL 中的域名部分替换为 m66.net
    $url = preg_replace('/https?:\/\/([a-z0-9.-]+)/', 'https://m66.net', $matches[1]);
    return '<a href="' . $url . '">' . $matches[2] . '</a>';
}

// 正则表达式匹配 Markdown 链接
$pattern = '/\[(.*?)\]\((https?:\/\/[^\s)]+)\)/';

// 使用 preg_replace_callback_array 进行替换
$replaced_text = preg_replace_callback_array(
    [
        $pattern => 'replace_url_domain'
    ],
    $markdown_text
);

echo $replaced_text;

2. 替换粗体和斜体

Markdown 中的粗体使用 **__,而斜体使用 *_,我们可以用正则表达式将其替换为 HTML 的 <strong><em> 标签。

$markdown_text = "这是一段 **粗体** 文本和 *斜体* 文本。";

// 替换粗体的回调函数
function replace_bold($matches) {
    return '<strong>' . $matches[1] . '</strong>';
}

// 替换斜体的回调函数
function replace_italic($matches) {
    return '<em>' . $matches[1] . '</em>';
}

// 正则表达式匹配 Markdown 粗体和斜体
$bold_pattern = '/\*\*(.*?)\*\*/';
$italic_pattern = '/\*(.*?)\*/';

// 使用 preg_replace_callback_array 进行替换
$replaced_text = preg_replace_callback_array(
    [
        $bold_pattern  => 'replace_bold',
        $italic_pattern => 'replace_italic'
    ],
    $markdown_text
);

echo $replaced_text;

综合示例

我们可以将这两种替换逻辑结合起来,处理一个包含链接、粗体和斜体的 Markdown 文本:

欢迎访问 <a href="https://m66.net">Google</a>,它是一个 <strong>强大的</strong> 搜索引擎。你也可以尝试 <em>Bing</em> 搜索引擎。