HTMLタグと実体参照(エンティティ)の仕組み — タグ除去が意外と難しい理由

HTMLタグと実体参照は、装飾されたテキストを表現するための2つの異なる仕組みです。両方を理解すると「タグを消すだけ」では済まない理由が見えてきます。

タグは要素の始まりと終わりを示す印

<p>や<strong>のようなタグは、開始と終了のペアで内容を囲み、ブラウザに「これは段落だ」「これは太字だ」と伝える役割を持ちます。タグ自体には表示される文字は含まれておらず、あくまで指示情報です。

エンティティは表記を崩す文字を安全に表す仕組み

<や&のような文字はHTMLの構文として特別な意味を持つため、そのままでは記述できず、&lt;(<)や&amp;(&)、&nbsp;(改行しない空白)のような実体参照として書かれます。正しい変換にはこれらを元の文字に戻す処理が必要で、単にタグを削るだけでは対応できません。

ブロック要素とインライン要素で改行の扱いが異なる

<div>や<p>、<li>はブロック要素として新しい行を作りますが、<span>や<a>、<strong>はインライン要素として同じ行の中に収まります。改行を補わずにタグだけを一律に削除すると、本来別々の段落だった文章がひと続きになってしまいます。

タグを除去したくなる典型的な場面

ウェブページからコピーしたリッチテキストをプレーンテキスト欄やスプレッドシートのセル、マークアップを解釈できないシステムに貼り付けると、目に見えないHTML装飾が一緒に入り込み、文字化けや余計な記号として表示されることがあります。

見た目のタグ除去とセキュリティ対策は別物

単純な正規表現による<tag>パターンの削除は、閉じられていないタグや入れ子構造、意図的に難読化されたマークアップに弱く、表示用の整形処理とスクリプト混入対策(サニタイズ)は目的が異なります。セキュリティが関わる場面では専用のサニタイズライブラリが必要です。

そもそもなぜエンティティが存在するのか

HTMLは<や&のような一部の文字を構文として使うため、生のテキストに<が現れるとブラウザはタグの開始だと解釈してしまいます。エンティティを使えば、これらの文字を装飾指示ではなく表示用の文字としてそのまま文書に含めることができ、正確な「プレーンテキスト化」にはこれを元の文字へ戻す処理が欠かせません。

単純なタグ除去が破綻する場面

実際のHTMLは教科書のようには綺麗でなく、閉じタグの欠落、コピー時に分断されたタグ、実際のタグではない山カッコを含むコメントやスクリプトブロックなど、単純な検索置換では対応しきれないケースが頻出します。パターンマッチではなく正しいHTMLパーサーを使えば、こうした例外を正確に処理できます。

よくある質問

リンクからタグを除去すると、URLの情報も消えますか?

はい、多くの単純な処理では消えます。表示されているリンクの文字は残りますが、タグが持っていたリンク先(href)の情報はタグと一緒に失われます。もともと表示テキストの一部ではなかったためです。

タグの除去はセキュリティ対策のサニタイズと同じですか?

いいえ。タグ除去は表示や保存のために綺麗なプレーンテキストを作ることが目的で、サニタイズは悪意あるコードの実行を防ぐことが目的です。サニタイズには単純なタグ削除ではなく、実績のある専用ライブラリを使う必要があります。