PHP Tips | 文字列処理:基本操作 – HTML タグ除去

PHP PHP
スポンサーリンク

「HTML タグ除去」とは何か

PHP で文字列を扱っていると、<p>, <a>, <div> のような「HTML タグ」が含まれていることがあります。
ブラウザで表示する分には問題ありませんが、「純粋なテキストだけが欲しい」場面では、これが邪魔になります。

例えば、こんな文字列です。

$html = '<p>こんにちは、<strong>世界</strong>!</p>';
PHP

この中から、<p><strong> といったタグを取り除いて、

こんにちは、世界!

のような「タグなしのテキスト」だけを取り出すのが「HTML タグ除去」です。


なぜ HTML タグを除去したくなるのか

プレーンテキストとして保存・表示したいとき

ブログ記事やお知らせ文などを HTML で保存していても、
一覧画面やメールの件名などでは「タグなしの短いテキスト」が欲しくなることがあります。

例えば、

  • 記事の本文は HTML で保存している
  • 一覧画面では「本文の冒頭 50 文字だけ」をテキストで表示したい

というようなケースです。

このとき、HTML タグが残ったままだと、こんなことになります。

$html = '<p>こんにちは、<strong>世界</strong>!</p>';

$summary = mb_substr($html, 0, 10);
echo $summary;
PHP

結果はこうなります。

<p>こんにちは、<stro

見た目もおかしいし、タグの途中で切れてしまっていて、かなり微妙です。
先に HTML タグを除去しておけば、きれいなテキストとして扱えます。

検索やインデックス用に「文字だけ」が欲しいとき

全文検索やインデックスを作るとき、HTML タグは邪魔になります。
検索対象にしたいのは「ユーザーが読む文字」であって、「<div><span>」ではありません。

HTML タグを除去しておけば、

  • 検索対象のテキストがシンプルになる
  • インデックスのサイズが無駄に膨らまない

といったメリットがあります。

セキュリティ上の観点(XSS とは別の話として)

「HTML タグ除去」は、XSS 対策(<script> を消すなど)と混同されがちですが、
ここでは「安全性」よりも「テキスト整形」の意味合いが強いです。

ただし、「ユーザー入力をそのまま HTML として表示したくない」「とりあえずタグは全部消したい」という場面では、
簡易的な防御としても使われることがあります。


PHP 標準の武器:strip_tags 関数

strip_tags の基本

PHP には、HTML タグを除去するための標準関数 strip_tags が用意されています。

$html = '<p>こんにちは、<strong>世界</strong>!</p>';

$text = strip_tags($html);

echo $text;  // こんにちは、世界!
PHP

strip_tags は、その名の通り「タグを剥がす」関数です。

  • <p><strong> のような開始タグ
  • </p></strong> のような終了タグ

を取り除き、中のテキストだけを残してくれます。

属性付きのタグもちゃんと消える

HTML タグには属性がついていることが多いですが、それもまとめて消してくれます。

$html = '<a href="https://example.com" class="btn">リンク</a>';

echo strip_tags($html);  // リンク
PHP

タグの中身(ここでは「リンク」)だけが残ります。


一部のタグだけ残したい場合

許可するタグを指定する

strip_tags には、「このタグだけは残していいよ」と指定する機能があります。

$html = '<p>こんにちは、<strong>世界</strong>!<br>今日はいい天気です。</p>';

// <strong> と <br> だけは残す
$text = strip_tags($html, '<strong><br>');

echo $text;
// こんにちは、<strong>世界</strong>!<br>今日はいい天気です。
PHP

第2引数に「許可したいタグ」を文字列で渡します。

ここでのポイントは、

  • <strong><br> のように、タグをそのまま並べて書く
  • 閉じタグ </strong> は書かなくてよい(自動的に対応してくれる)

というところです。

実務での使いどころ

例えば、

  • 太字や改行だけは残したい
  • でも、レイアウト用の <div><span> はいらない

というような場面で、この「一部タグだけ許可」が役に立ちます。


strip_tags の注意点と限界

HTML として完全に正しいかどうかは気にしない

strip_tags は「HTML パーサー」ではなく、「それっぽいタグを削る関数」です。
つまり、HTML が厳密に正しいかどうかはあまり気にせず、「<> に囲まれたもの」をタグとして扱います。

例えば、こんなケースです。

$text = '価格は < 1000 円です。';

echo strip_tags($text);  // 価格は  1000 円です。
PHP

< 1000 の部分が「タグっぽい」と判断されて消えてしまい、スペースが2つ残ります。
こういう「タグじゃないけど < を使っている」ケースでは、strip_tags は少し乱暴に働くことがあります。

JavaScript やスタイルを完全に安全にする目的には不十分

strip_tags は「タグを消す」だけであり、「中身の JavaScript まで完全に無害化する」ことを保証するものではありません。
本格的な XSS 対策には、htmlspecialchars や専用のライブラリを使う必要があります。

ここではあくまで、

「HTML をテキストとして扱いたいから、タグをざっくり剥がしたい」

という用途に向いている、と理解しておくとよいです。


実務での具体的なシチュエーション例

例題1:記事本文から「一覧用の要約テキスト」を作る

ブログ記事やお知らせ文を HTML で保存しているとします。

$body = '<p>こんにちは、<strong>世界</strong>!</p><p>今日はいい天気ですね。</p>';
PHP

一覧画面では、「本文の冒頭 30 文字だけ」をテキストで表示したいとします。

// 1. HTML タグを除去
$text = strip_tags($body);

// 2. 全角対応で先頭 30 文字を取得
$summary = mb_substr($text, 0, 30);

// 3. 必要なら「…」をつける
if (mb_strlen($text) > 30) {
    $summary .= '…';
}

echo $summary;
PHP

このように、

  1. まずタグを除去してプレーンテキストにする
  2. そのうえで文字数を数えたり、切り出したりする

という流れにすると、見た目もきれいで、タグの途中で切れることもありません。

例題2:ユーザー入力を「テキストだけ」にして保存する

ユーザーがリッチテキストエディタなどで入力した内容を、
「HTML のまま保存するのではなく、テキストだけ保存したい」というケースもあります。

$inputHtml = $_POST['comment'] ?? '';

// HTML タグを全部除去してから保存
$commentText = strip_tags($inputHtml);

// あとは $commentText を DB に保存
PHP

このようにしておけば、DB には「タグなしのテキスト」だけが入るので、
後から検索や集計をするときに扱いやすくなります。

例題3:メールのプレーンテキスト版を作る

HTML メールを送るとき、プレーンテキスト版も一緒に送ることがよくあります。
そのとき、「HTML 版からテキスト版を自動生成したい」というニーズが出てきます。

$htmlBody = '<p>こんにちは、<strong>山田様</strong>。</p><p>ご注文ありがとうございます。</p>';

// HTML タグを除去してテキスト版を作る
$textBody = strip_tags($htmlBody);

// 改行を整えたい場合は、<br> や </p> を先に改行に変換してから strip_tags する、という手もある
PHP

実務では、

  1. <br></p>"\n" に置き換える
  2. そのあとで strip_tags する

といった工夫を組み合わせて、「読みやすいテキスト版」を作ることも多いです。


もう一歩踏み込んだ実用パターン

改行も意識した「テキスト化」処理の例

単純にタグを消すだけだと、段落の区切りが分かりにくくなることがあります。
そこで、「改行を入れたいタグ」を先に改行に変換してから strip_tags する、というテクニックがあります。

function htmlToPlainText(string $html): string
{
    // 段落や改行タグを、いったん改行コードに置き換える
    $html = str_replace(
        ['<br>', '<br/>', '<br />', '</p>', '</div>'],
        "\n",
        $html
    );

    // HTML タグを除去
    $text = strip_tags($html);

    // 連続する改行を1つにまとめるなど、整形してもよい
    $text = preg_replace("/\n{2,}/", "\n\n", $text);

    // 前後の空白や改行をトリム
    $text = trim($text);

    return $text;
}

$html = '<div><p>こんにちは、<strong>世界</strong>!</p><p>今日はいい天気ですね。<br>散歩に行きましょう。</p></div>';

echo htmlToPlainText($html);
PHP

出力イメージはこんな感じです。

こんにちは、世界!

今日はいい天気ですね。
散歩に行きましょう。

このように、「タグ除去」+「改行整形」を組み合わせると、
人間が読みやすいテキストを作ることができます。


重要ポイントの深掘り

「HTML をどう扱いたいか」を先に決める

HTML タグ除去を使う前に、まず自分に問いかけてほしいのはこれです。

  • 完全にテキストだけにしたいのか
  • 一部のタグ(太字、改行など)は残したいのか
  • 段落の区切りはどう表現したいのか(改行? 空行?)

これによって、書くべきコードが変わります。

「とりあえず全部消したい」なら strip_tags($html) で十分ですが、
「読みやすさ」や「意味の保持」まで考えるなら、str_replacepreg_replace と組み合わせて整形する必要があります。

セキュリティ対策と混同しない

もう一度強調しておくと、

strip_tags は「テキスト整形」の道具であって、「完全な XSS 対策ツール」ではない

という点はとても重要です。

  • 「HTML を表示したいけど安全にしたい」→ htmlspecialchars や専用ライブラリ
  • 「HTML をテキストとして扱いたい」→ strip_tags や独自整形

というように、目的によって使い分ける意識を持っておくと、実務で迷いにくくなります。


まとめ:今日から使える「HTML タグ除去」テンプレ

一番シンプルな「全部のタグを消す」パターンはこれです。

$text = strip_tags($html);
PHP

一部のタグだけ残したい場合は、こう書きます。

$text = strip_tags($html, '<strong><em><br>');
PHP

段落や改行も意識して「読みやすいテキスト」にしたい場合は、こんな関数が実務的です。

function htmlToPlainText(string $html): string
{
    $html = str_replace(
        ['<br>', '<br/>', '<br />', '</p>', '</div>'],
        "\n",
        $html
    );

    $text = strip_tags($html);
    $text = preg_replace("/\n{2,}/", "\n\n", $text);
    return trim($text);
}
PHP

タイトルとURLをコピーしました