【PHP8.x】strip_tags関数の使い方

strip_tags関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

strip_tags関数は、文字列からHTMLやXMLのタグを除去する関数です。この関数は、主にウェブアプリケーションにおいて、ユーザーからの入力データに含まれる不正なHTMLタグを取り除き、セキュリティを高める目的で利用されます。例えば、投稿されたコメントや記事の内容に含まれる悪意のあるスクリプトタグ(<script>など)を除去することで、クロスサイトスクリプティング(XSS)攻撃を防ぐための一助となります。

基本的な使い方として、第一引数にはタグを除去したい文字列を指定します。これにより、指定された文字列内のすべてのHTML/XMLタグが取り除かれ、プレーンテキストとして返されます。さらに、第二引数 $allowable_tags をオプションで指定することで、除去せずに残したい特定のタグを指定することも可能です。例えば、<p><a> のように指定すると、段落タグやアンカータグは残しつつ、それ以外のタグは除去されます。

この関数は、HTMLコンテンツからシンプルなテキストを抽出したり、表示前に余分な装飾タグを削除したりする場合にも役立ちます。ただし、strip_tags関数はHTMLパーサーではないため、不完全なHTML構造や複雑なケースにおいては意図しない結果を招く可能性があります。また、XSS対策としては、この関数によるタグ除去だけでなく、htmlspecialchars関数などを用いた適切なエスケープ処理も併用することが重要です。

構文(syntax)

1strip_tags(string $string, array|string|null $allowed_tags = null): string

引数(parameters)

string $string, array|string|null $allowed_tags = null

  • string $string: タグを取り除きたい文字列を指定します。
  • array|string|null $allowed_tags = null: 取り除かずに残したいHTMLタグを指定します。省略した場合、すべてのHTMLタグが取り除かれます。

戻り値(return)

string

指定された文字列からHTMLおよびPHPタグを取り除いた結果の文字列を返します。

サンプルコード

PHP strip_tagsで特定タグ以外を除外する

1<?php
2
3/**
4 * HTML文字列から特定のタグを除いて、全てのHTMLタグを取り除きます。
5 *
6 * @param string $htmlString 処理対象のHTML文字列。
7 * @return string 特定のタグを除いた、HTMLタグが取り除かれた文字列。
8 */
9function cleanHtmlExceptSpecificTags(string $htmlString): string
10{
11    // 残したいタグを配列で指定します。
12    // 例: 'b' (太字), 'i' (斜体), 'a' (リンク) など
13    // この例では、<b>タグと<a>タグのみを残します。
14    $allowedTags = ['b', 'a'];
15
16    // strip_tags関数は、第一引数に処理する文字列、
17    // 第二引数に許可するタグ(削除しないタグ)を指定します。
18    // 許可するタグは、文字列(例: '<b><a>')または配列(例: ['b', 'a'])で指定できます。
19    // PHP 8では配列での指定がより推奨されます。
20    $cleanedString = strip_tags($htmlString, $allowedTags);
21
22    return $cleanedString;
23}
24
25// サンプルHTML文字列を定義します。
26$inputHtml = "<p>これは<b>重要な</b>情報です。</p>" .
27             "<p>詳細はこちらの<a href=\"https://example.com\">リンク</a>を参照してください。</p>" .
28             "<script>alert('このスクリプトは削除されます');</script>" .
29             "<i>斜体は削除されます</i>";
30
31echo "--- 元のHTML文字列 ---\n";
32echo $inputHtml . "\n\n";
33
34// 関数を呼び出し、特定のタグを除いてHTMLタグを取り除きます。
35$outputCleaned = cleanHtmlExceptSpecificTags($inputHtml);
36
37echo "--- 特定のタグ(<b>と<a>)を除いてクリーンアップされた文字列 ---\n";
38echo $outputCleaned . "\n";
39
40?>

PHPのstrip_tags関数は、HTML文字列からHTMLタグを取り除くために使用される重要な関数です。ウェブサイトからのユーザー入力を安全に処理したり、HTMLコンテンツをテキスト形式で表示したりする際に役立ちます。

この関数の第一引数には、処理対象となるHTML文字列を指定します。第二引数はオプションで、削除せずに残したい特定のHTMLタグを指定するために使われます。この第二引数には、残したいタグを文字列(例: '<b><a>')または配列(例: ['b', 'a'])で指定できますが、PHP 8では配列での指定が推奨されています。関数は、指定されたタグ以外を全て取り除いた結果の文字列を返します。

サンプルコードでは、cleanHtmlExceptSpecificTagsという関数を定義し、strip_tags関数を使って特定のタグを残す処理を実演しています。この例では、残したいタグとして<b>(太字)と<a>(リンク)が配列で指定されています。これにより、入力されたHTML文字列から<p><script>, <i>といったタグは削除されますが、<b>タグと<a>タグで囲まれた内容はそのまま維持されます。結果として、元のHTMLから不要なタグや潜在的に危険なスクリプトなどが取り除かれ、必要最低限の書式が保たれたクリーンな文字列が得られます。

strip_tags関数は、HTMLタグを全て取り除きますが、第二引数に残したいタグを配列で指定することで、特定のタグのみを保持できます。PHP 8では配列での指定が推奨され、コードの可読性も向上します。ただし、この関数はタグの属性(例:<a>タグのhref属性)までは保持しません。そのため、属性も残したい場合は別の処理が必要です。また、<script>タグなどの悪意あるコードの除去に役立ちますが、完全なセキュリティ対策とはならないため、入力値の検証や適切なエスケープ処理と組み合わせて利用することが重要です。許可するタグの指定ミスは意図しない情報損失に繋がるため、十分注意してください。

PHP strip_tags でタグ除去する

1<?php
2
3/**
4 * strip_tags 関数で HTML タグが除去されない場合のデバッグと解決策を示すサンプルコード。
5 * 特に、許可するタグを指定する場合の注意点と、文字コードの問題に対処する方法を解説する。
6 */
7
8// 文字列の定義 (UTF-8 エンコード)
9$string = '<p>This is <b>bold</b> text.</p><script>alert("XSS");</script><img src="test.png">';
10
11// strip_tags 関数で HTML タグを除去 (デフォルト設定)
12$stripped_string = strip_tags($string);
13echo "デフォルト設定での結果:\n";
14echo $stripped_string . "\n\n"; // <p>This is bold text.</p>alert("XSS")<img> が出力される (script, img は除去される)
15
16// 許可するタグを指定して HTML タグを除去
17$allowed_tags = '<p><b>'; // 許可するタグ (p と b)
18$stripped_string_with_allowed_tags = strip_tags($string, $allowed_tags);
19echo "許可するタグを指定した場合の結果:\n";
20echo $stripped_string_with_allowed_tags . "\n\n"; // <p>This is <b>bold</b> text.</p>alert("XSS")<img> が出力される (script, img は除去される)
21
22// エラーハンドリング
23$malformed_string = "<p>This is an unclosed tag.";
24$stripped_malformed_string = strip_tags($malformed_string);
25echo "不正なHTMLでの結果:\n";
26echo $stripped_malformed_string . "\n\n"; // This is an unclosed tag. が出力される
27
28// 文字コードに関する注意点
29// strip_tags は HTML エンティティを変換しないため、必要に応じて htmlentities などを使用する
30$string_with_entities = '<p>This is &eacute; text.</p>';
31$stripped_string_with_entities = strip_tags($string_with_entities);
32echo "HTMLエンティティを含む文字列の結果:\n";
33echo $stripped_string_with_entities . "\n\n"; // This is é text. が出力される
34
35// マルチバイト文字列の場合、mb_string 拡張関数を利用する
36$multibyte_string = '<p>こんにちは、世界!</p>';
37$stripped_multibyte_string = strip_tags($multibyte_string);
38echo "マルチバイト文字列の結果:\n";
39echo $stripped_multibyte_string . "\n"; // こんにちは、世界! が出力される (特に問題なし)
40
41?>

strip_tags関数は、文字列からHTMLおよびPHPタグを取り除く関数です。第一引数$stringにタグを取り除く対象の文字列を指定します。第二引数$allowed_tagsは省略可能で、許可するタグを文字列または配列で指定します。この引数を指定することで、特定のHTMLタグのみを残すことが可能です。関数は、タグが取り除かれた文字列を返します。

サンプルコードでは、strip_tags関数の基本的な使用方法と、いくつかの注意点を示しています。デフォルト設定では、多くのHTMLタグが除去されます。許可するタグを指定した場合も、指定されたタグ以外は除去されます。

不正なHTML(閉じられていないタグなど)が含まれる場合、strip_tagsは可能な範囲でタグを取り除きます。

また、strip_tagsはHTMLエンティティ(&eacute;など)を変換しないため、必要に応じてhtmlentities関数などを利用してエンティティを変換する必要があります。マルチバイト文字列(日本語など)を扱う場合、特に設定を変更する必要はありません。正しく処理されます。

strip_tagsが期待通りに動作しない場合、許可するタグの指定が正しいか、HTMLエンティティが適切に処理されているかなどを確認してください。

strip_tags関数はHTMLタグを除去しますが、HTMLエンティティは変換せず、不正なHTMLも可能な限り処理します。許可するタグを指定する際は「<p><b>」のように山括弧を含めて正確に記述してください。タグ名のみでは機能しませんのでご注意ください。本関数はXSSなどのセキュリティ対策としては不完全であり、単独での使用は推奨されません。ユーザー入力にはhtmlspecialcharsと組み合わせるか、より堅牢なサニタイズライブラリの利用をご検討ください。文字コードはstrip_tagsが直接処理しないため、HTMLエンティティを処理する場合はhtml_entity_decodeなどを併用してください。

関連コンテンツ