- ベストアンサー
PHPでテキストファイルを読み込み、タグをエスケープする方法について
- PHPで作成したスクリプトでテキストファイルを読み込み、HTMLタグが含まれている場合にタグをエスケープする方法について説明します。
- 現在のスクリプトでは、テキストデータをそのまま出力するため、HTMLタグが有効になっています。
- しかし、テキストデータにHTMLタグが含まれている場合は、ブラウザがタグとして認識し、表示されない問題があります。タグをエスケープする方法として、htmlspecialchars関数を使用することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
先ほどのReplace関数用に、 変換するもののリストがあれば、よさそうには思えます。 どちらにしても、全部自動ってのは、不可能なので。 どっちをとるかは、判断が必要ですが。 1>「リスト」にあれば、そのままなのか? 2>「リスト」になければ、そのままなのか? の2択ですね。 少なくとも、変換候補を自動で判断できない以上そこは 仕方がないかもしれません。 strposなどで、"<"を見つけたら、続く">"をスキャンしてみて、 範囲をリストから抽出など。。 $pos_start=strpos($text,"<"); if ($pos_start!==false) { $pos_end=strpos($text,">",$pos_start); // これをしないとそれよりも「前」がヒットするため } あとは、substrなどで、切り出してみれば比較用文字列が取り出せるので、 それをリスト比較ですかね。。 なお、この方法を使うとき、 クオート分解がやや、めんどくさいですけどね。 <tag param="<hoge>"> と、シングルクオートまたはダブルクオート内で<>が使われる可能性があるので。そこをフィルタしつつですかね。
その他の回答 (1)
- AsarKingChang
- ベストアンサー率46% (3467/7474)
ならば・・・ echo htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); これを、一度変数に押し込みます。 $temp=htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); echo str_replace("<br>", "<br>", $temp); と、質問者さんが変換してほしくなかった場合のみのケースを、 元に戻してあげる!という手はいかがですか?
お礼
ご回答ありがとうございます。 ただ、テキストも決まった文字列でないのと同時に、HTMLタグも固定ではありません.. また、単なるタグでなく、<script ..ってのもありえます。 全部を置き換え指定するのも非現実的ですよね.. 半角<>を全角<>にするのも何だかな~と。テキスト上では全角にしておいて.. $txt = str_replace("<", "<", $txt); $txt = str_replace(">", ">", $txt); こんな感じでしょうか..
補足
ご回答ありがとうございます。 ただ、テキストも決まった文字列でないのと同時に、HTMLタグも固定ではありません.. また、単なるタグでなく、<script ..ってのもありえます。 全部を置き換え指定するのも非現実的ですよね.. 半角<>を全角<>にするのも何だかな~と。テキスト上では全角にしておいて.. $txt = str_replace("<", "<", $txt); $txt = str_replace(">", ">", $txt); こんな感じでしょうか..
お礼
ありがとうございました。地道にエスケープします..