🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【PHP入门】可复用的魔法!如何用函数(function)生成摘要文本

在博客列表页面等处,你是否曾想过只显示每篇文章开头的简短部分?用于告诉读者“这篇文章是关于这个内容的”的“摘要文本”,在提高网站的浏览率方面非常重要。但是,每增加一篇文章就手动制作摘要,一定很麻烦吧?

本文将介绍一个能解决这一烦恼的PHP魔法工具——函数(function)。让我们来尝试自己动手,用PHP函数制作一个方便的“摘要文本生成工具”,它可以接收长篇文章,按指定的字数进行裁剪,并在末尾加上“...阅读更多”。我们还会讲解作为安全对策必不可少的htmlspecialchars()函数,让你能获得既安全又实用的代码。即使是初学者也可以直接复制粘贴!

要准备运行PHP(开发环境),如果还没有搭建XAMPP的朋友,请参考【PHP入门】XAMPP下载及安装方法完全解析!。 安装后,将PHP文件放置在指定文件夹(如 `htdocs`)中,准备工作就完成了!

1. 整理代码的魔法“函数”是什么?

首先,“函数”是什么呢?简单来说,它就像一个“自制工具”,将特定的处理打包并命名,以便随时调用使用

例如,如果你把“接收文章,裁剪成100个字,并在末尾加上‘...’”这一系列处理制作成一个函数,那么每次需要摘要时,只需调用该函数即可。这样就不必重复编写相同的代码,使整个代码变得整洁且易于管理,这就是函数的最大优点。

基本语法如下:

<?php
function 函数名(参数1, 参数2, ...) {
  // 在这里编写要执行的处理

  return 返回值; // 返回处理结果
}
?>

如果把参数看作是传递给函数的“材料”,把返回值看作是函数返回的“完成品”,就很容易理解了。那么,我们就用这个语法来制作摘要生成函数吧。

2. 实践!来制作一个生成摘要的函数吧

这里是本文的重点。我们将创建一个名为make_excerpt()的函数,当你指定长篇文章和字数时,它会返回一个恰到好处的省略摘要。以下代码是一个完整的HTML示例,你可以直接复制粘贴到文件中,并立即在浏览器中确认其运行效果。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>摘要文本生成工具</title>
    <style>
        body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
        .original-text { background: #f4f7f6; border-left: 5px solid #ccc; padding: 10px; margin-bottom: 20px; }
        .excerpt { background: #e8f4f8; border-left: 5px solid #007bff; padding: 10px; }
    </style>
</head>
<body>

    <h1>摘要生成测试</h1>

    <?php
    /**
     * 生成摘要文本的函数
     * @param string $text 原始文章
     * @param int $length 限制字数
     * @return string 生成的摘要文本
     */
    function make_excerpt(string $text, int $length): string {
        // 检查原始文章的字数
        if (mb_strlen($text) > $length) {
            // 按指定字数裁剪,并在末尾添加“...阅读更多”
            return mb_substr($text, 0, $length) . '...阅读更多';
        } else {
            // 如果字数少于限制,则直接返回原文
            return $text;
        }
    }

    // 作为源的长篇文章
    $long_text = '这是一篇非常长的文章。本文详细解说了如何使用PHP函数将文章裁剪为特定字数并生成摘要。这是在博客列表页面等场景中非常有用的实用技巧。';

    // 调用函数生成50个字的摘要
    $excerpt_text = make_excerpt($long_text, 50);
    ?>

    <h2>原始文章</h2>
    <div class="original-text">
        <?php echo $long_text; ?>
    </div>

    <h2>生成的摘要(50字限制)</h2>
    <div class="excerpt">
        <?php echo $excerpt_text; ?>
    </div>

</body>
</html>

此代码的要点是mb_strlen()mb_substr()。要正确处理像中文这样的多字节字符,必须使用以`mb_`开头的函数,而不是strlen()substr()。这样可以防止乱码,并确保能按预期的字数进行裁剪。

3. 重要!使用htmlspecialchars确保安全显示

在网页上显示文本时,绝对不能忘记的是安全对策。如果要显示的文本中包含<script>之类的HTML标签,直接显示可能会引发意想不到的操作(跨站脚本攻击)。

这时htmlspecialchars()函数就派上用场了。这个函数会将HTML中具有特殊意义的字符(例如:<, >, &, ")转换为无害的字符串(例如:&lt;, &gt;, &amp;, &quot;)。

我们也把这个处理整合到摘要生成函数中,使其更加安全吧。

<?php
/**
 * 生成安全摘要的改进版函数
 */
function make_safe_excerpt(string $text, int $length): string {
    // 1. 首先用htmlspecialchars进行转义
    $safe_text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');

    // 2. 对转义后的文本进行字数检查和裁剪
    if (mb_strlen($safe_text) > $length) {
        return mb_substr($safe_text, 0, $length) . '...阅读更多';
    } else {
        return $safe_text;
    }
}

// 可能包含HTML标签的文章
$dangerous_text = '<strong>强调</strong>的文本和<script>alert("danger!");</script>这样的恶意代码。';

// 使用改进版函数生成安全的摘要
$safe_excerpt = make_safe_excerpt($dangerous_text, 20);

echo $safe_excerpt;
?>

使用这个`make_safe_excerpt()`函数,即使原文中包含HTML标签,它们也只会被当作普通字符串安全地显示出来,不用担心会破坏页面布局或执行脚本。

4. 应用示例:与foreach循环结合使用

那么,让我们把这个方便的摘要生成函数与上一篇文章中学到的`foreach`循环结合起来吧。我们将从一个包含多篇博客文章的数组中,动态生成一个标题和摘要的列表。

<?php
// 生成安全摘要的函数(假定已在前面的例子中定义)
function make_safe_excerpt(string $text, int $length): string {
    $safe_text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
    if (mb_strlen($safe_text) > $length) {
        return mb_substr($safe_text, 0, $length) . '...阅读更多';
    }
    return $safe_text;
}

// 博客文章数据数组
$blog_posts = [
    [
        "title" => "掌握PHP基础",
        "content" => "本文解说PHP的基本语法和变量。内容设计得让编程初学者也能安心学习,请务必阅读。"
    ],
    [
        "title" => "数据库连接的秘诀",
        "content" => "Web开发中不可或缺的数据库。阅读本文,你就能在5分钟内学会如何从PHP连接到MySQL数据库,并获取和操作数据。文中还附有丰富的示例代码。"
    ]
];
?>

<div class="post-list">
    <?php foreach ($blog_posts as $post): ?>
        <article>
            <h3><?php echo htmlspecialchars($post['title']); ?></h3>
            <p><?php echo make_safe_excerpt($post['content'], 60); ?></p>
        </article>
    <?php endforeach; ?>
</div>

就这样,一旦创建了函数,就可以在网站的各个地方(如循环处理中)反复调用。提高代码的复用性和简化维护是函数的一大魅力。

5. 总结与相关代码介绍

这次,我们学习了如何使用PHP的“函数”来按指定字数裁剪文章,并生成安全的摘要。函数化的优点在于代码的整理和复用性的提高。这次制作的`make_safe_excerpt`函数,想必会在你的网站制作项目中成为一个多次发挥作用的便利工具。

PHP还准备了许多其他方便的字符串操作函数。例如,用于搜索特定字符串的`mb_strpos()`、进行替换的`str_replace()`,以及完全去除HTML标签的`strip_tags()`等。通过组合使用这些函数,还可以实现更高级的文本处理。请务必多加研究和尝试。