「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; // こんにちは、世界!
PHPstrip_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このように、
- まずタグを除去してプレーンテキストにする
- そのうえで文字数を数えたり、切り出したりする
という流れにすると、見た目もきれいで、タグの途中で切れることもありません。
例題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実務では、
<br>や</p>を"\n"に置き換える- そのあとで
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_replace や preg_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