その名前が示すように、strip_tags
すべての HTML タグを削除する必要があります。それを証明できる唯一の方法は、ソース コードを分析することです。次の分析はstrip_tags('...')
、ホワイトリストに登録されたタグの 2 番目の引数なしで呼び出しに適用されます。
まず、HTML タグに関するいくつかの理論: タグは で始まり、<
その後に非空白文字が続きます。この文字列が で始まる場合は、解析しない?
でください。この文字列が で始まる場合、コメントと見なされ、次のテキストも解析されません。コメントは で終了します。コメント内では、やなどの文字を使用できます。属性はタグで使用でき、その値はオプションで引用符 (または)で囲むことができます。そのような引用符が存在する場合は、それを閉じる必要があります。それ以外の場合は、タグは閉じられません。!--
-->
<
>
'
"
>
このコード<a href="example>xxx</a><a href="second">text</a>
は、Firefox では次のように解釈されます。
<a href="http://example.com%3Exxx%3C/a%3E%3Ca%20href=" second"="">text</a>
PHP 関数は、 ext/standard/string.c の 4036 行strip_tags
で参照されています。その関数は、内部関数 php_strip_tags_exを呼び出します。
出力用と「HTML タグ内」用の 2 つのバッファが存在します。という名前のカウンターdepth
は、開き山かっこ ( <
) の数を保持します。
変数in_q
には、引用符 ('
または"
) がある場合はそれが含まれ、それ以外の場合は含まれ0
ます。最後の文字は変数に格納されますlc
。
関数は 5 つの状態を保持します。3 つの状態は、関数の上の説明で言及されています。この情報と関数本体に基づいて、次の状態を導き出すことができます。
- 状態 0 は出力状態です (どのタグにもありません)。
- 状態 1 は、通常の html タグ内にあることを意味します (タグ バッファには が含まれます
<
) 。
- 状態 2 は、php タグ内にいることを意味します
- 状態 3: 出力状態から来て、
<
および!
文字に遭遇しました (タグ バッファには が含まれています<!
)
- 状態 4: HTML コメント内
タグを挿入できないことに注意する必要があります。つまり、<
空白以外の文字が続きます。行 4326<
は、以下に説明する文字のケースをチェックします。
- 引用符で囲まれている場合 (例:
<a href="inside quotes">
)、その<
文字は無視されます (出力から削除されます)。
- 次の文字が空白文字の場合
<
は、出力バッファーに追加されます。
- HTML タグの外側の場合、状態は
1
(「HTML タグの内側」) になり、最後の文字lc
が に設定されます。<
- それ以外の場合、HTML タグ内の場合、指定されたカウンター
depth
がインクリメントされ、文字は無視されます。
>
タグが開いている間に が満たされると ( ) state == 1
、(「引用符内にない」) にin_q
なり、(「タグ内にない」) になります。タグ バッファは破棄されます。0
state
0
属性チェック ('
や などの文字の場合"
) は、破棄されるタグ バッファーで行われます。したがって、結論は次のとおりです。
タグ ホワイトリストのない strip_tags は、タグの外側に含めても安全です。タグは許可されません。
「外側のタグ」とは、のようにタグ内にないことを意味します<a href="in tag">outside tag</a>
。のように、テキストには<
andが含まれる場合があり>
ます>< a>>
。ただし、結果は有効な HTML では<
なく>
、&
特に&
. それはで行うことができますhtmlspecialchars()
。
strip_tags
ホワイトリスト引数がない場合の説明は次のようになります。
返された文字列に HTML タグが存在しないことを確認します。