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

【PHP入門】再利用できる魔法!関数(function)で抜粋文を生成する方法

ブログの一覧ページなどで、各記事の冒頭部分だけを短く表示したいと思ったことはありませんか?「この記事はこんな内容ですよ」と読者に伝えるための「抜粋文」は、サイトの回遊率を高める上でとても重要です。しかし、記事が増えるたびに手作業で抜粋文を作るのは大変ですよね。

この記事では、そんな悩みを解決するPHPの関数(function)という魔法の道具を紹介します。長い文章を好きな文字数でカットし、文末に「...続きを読む」を付けてくれる便利な「抜粋文生成ツール」を、PHPの関数として自作してみましょう。セキュリティ対策として必須のhtmlspecialchars()も解説するので、安全で実用的なコードが手に入ります。初心者の方でもコピペOKです!

PHPを動かすための準備(開発環境)まだXAMPP「ザンプ」を構築してない方は、【PHP入門】XAMPPのダウンロードとインストール方法を徹底解説!を参照してください。 インストール後、指定されたフォルダ(`htdocs`など)にPHPファイルを置けば、準備は完了です!

1. コードを整理する魔法「関数」とは?

まず、「関数」とは何でしょうか?簡単に言えば、特定の処理をひとまとめにして名前を付け、いつでも呼び出して使えるようにした「自作の道具」のようなものです。

例えば、「文章を受け取って、100文字にカットして、末尾に『...』を付ける」という一連の処理を一つの関数として作っておけば、抜粋文が必要になるたびにその関数を呼び出すだけで済みます。同じコードを何度も書く必要がなくなり、コード全体がスッキリして管理しやすくなる、これが関数の最大のメリットです。

基本的な構文は以下の通りです。

<?php
function 関数名(引数1, 引数2, ...) {
  // ここに実行したい処理を書く

  return 戻り値; // 処理結果を返す
}
?>

引数(ひきすう)は関数に渡す「材料」で、戻り値(もどりち)は関数が返してくれる「完成品」と考えると分かりやすいでしょう。それでは、この構文を使って抜粋文生成関数を作っていきます。

2. 実践!抜粋文を生成する関数を作ってみよう

ここがこの記事のメインです。長い文章と文字数を指定すると、いい感じに省略された抜粋文を返してくれるmake_excerpt()という名前の関数を作成します。以下のコードは、このままファイルにコピペすれば、すぐにブラウザで動作を確認できる完全なHTMLの例です。

<!DOCTYPE html>
<html lang="ja">
<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()です。日本語のようなマルチバイト文字を正しく扱うには、strlen()substr()ではなく、頭に`mb_`が付いた関数を使う必要があります。これにより、文字化けを防ぎ、意図した通りの文字数でカットすることができます。

3. 重要!htmlspecialcharsで安全な表示を

Webページにテキストを表示する上で、絶対に忘れてはならないのが**セキュリティ対策**です。もし表示する文章に<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開発に欠かせないデータベース。この記事を読めば、PHPからMySQLデータベースに接続し、データを取得・操作する方法が5分で分かります。サンプルコードも豊富です。"
    ]
];
?>

<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()`などです。これらの関数を組み合わせることで、さらに高度なテキスト処理も可能になります。ぜひ色々調べて試してみてください。