Copicode 日本語トップ

PHPで安全な抜粋文を作る前に確認すること

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

この記事では、PHPの関数(function)で抜粋文を作る方法を扱います。ただし本番サイトでは、文字数を切るだけでは不十分です。HTMLタグを途中で切ると表示が崩れ、ユーザー入力やDB本文をそのまま出すとXSSの危険があります。どこで削り、どこでエスケープし、公開前に何を確認するかを先に整理します。

確認日: 2026年5月19日

このページで整理できること

  • 記事一覧、検索結果、管理画面で使う抜粋文の役割。
  • mb_substr()strip_tags()htmlspecialchars() を使う順番。
  • AIが作った抜粋関数を本番へ入れる前に確認すること。
  • 本文、DBデータ、ユーザー入力を表示する時に伏せるべき情報と注意点。

最初に分けること

使う場所 先に確認すること 次に読むページ
記事一覧 HTMLタグを落としてから短くし、表示直前でエスケープする foreachでお知らせ一覧を作る方法
検索結果や管理画面 長すぎる本文、改行、絵文字、未閉じタグで表示が崩れないか確認する PDOでデータを一覧表示する方法
フォーム投稿の内容 ユーザー入力を信用せず、保存前と表示時の両方を分けて考える PHPフォームの安全対策
AIが作った関数 DB接続情報や実在する投稿本文を貼らず、サンプル文字列で相談する AIコード安全公開の入口

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タグが含まれていても、それらは単なる文字列として安全に表示され、ページのレイアウトを崩したり、スクリプトが実行されたりする心配がありません。

実務では「削る」と「表示する」を分ける

本文にHTMLタグが混じる場合は、先に strip_tags() でタグを落とし、日本語対応の mb_substr() で短くして、最後に表示直前で htmlspecialchars() を通す流れにすると扱いやすくなります。エスケープ後の文字列を途中で切ると、&lt; のようなHTMLエンティティを途中で切ってしまうことがあるためです。

<?php
function make_display_excerpt(string $html, int $length): string {
    $plain_text = strip_tags($html);
    $short_text = mb_strlen($plain_text) > $length
        ? mb_substr($plain_text, 0, $length) . '...'
        : $plain_text;

    return htmlspecialchars($short_text, ENT_QUOTES, 'UTF-8');
}
?>

PHPの基本から整理したい場合は PHPで動的なWebサイトを作る基本、関数や配列を使った小さな表示例を見たい場合は PHP配列でプロフィールカードを作る方法 も参考になります。

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

記事一覧や検索結果で使う時の注意点

抜粋文は、一覧ページや検索結果の説明文に使えます。HTMLタグを含む本文から作る場合は、タグを除去してから文字数を丸めると表示崩れを防げます。

  • strip_tags() でHTMLタグを除去する
  • 日本語は mb_substr() を使う
  • 表示時は htmlspecialchars() を通す
  • DBから取得した本文でも信用しすぎない

関連: foreachでお知らせ一覧を作る方法

AIに抜粋文生成関数について相談するメモ

AIやCodexへ相談する時は、本番DBの接続情報や実在する投稿本文を貼らず、サンプルと目的だけを渡します。

PHPの抜粋文生成関数について相談します。

目的:
- 記事一覧 / 検索結果 / 管理画面 / メール本文 のどれか:

入力元:
- 固定テキスト / DB本文 / フォーム投稿 / MarkdownやHTMLを含む本文:

確認したいこと:
- HTMLタグを途中で切らないか
- 日本語の文字数を正しく扱えるか
- 表示直前でhtmlspecialcharsできているか
- 長い本文や空文字で表示が崩れないか

貼らない情報:
- DBホスト、ユーザー名、パスワード
- 実在する投稿本文、問い合わせ内容、メールアドレス
- 本番管理画面URL

公開前後に確認したいこと

抜粋文の関数は一覧ページ全体に効くため、小さなミスでも複数記事の表示崩れにつながります。公開前にローカルで表示し、公開後は本番URLでも確認してください。