• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エスケープしたくない、けど、したいのもある)

PHPでテキストファイルを読み込み、タグをエスケープする方法について

このQ&Aのポイント
  • PHPで作成したスクリプトでテキストファイルを読み込み、HTMLタグが含まれている場合にタグをエスケープする方法について説明します。
  • 現在のスクリプトでは、テキストデータをそのまま出力するため、HTMLタグが有効になっています。
  • しかし、テキストデータにHTMLタグが含まれている場合は、ブラウザがタグとして認識し、表示されない問題があります。タグをエスケープする方法として、htmlspecialchars関数を使用することができます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

先ほどのReplace関数用に、 変換するもののリストがあれば、よさそうには思えます。 どちらにしても、全部自動ってのは、不可能なので。 どっちをとるかは、判断が必要ですが。 1>「リスト」にあれば、そのままなのか? 2>「リスト」になければ、そのままなのか? の2択ですね。 少なくとも、変換候補を自動で判断できない以上そこは 仕方がないかもしれません。 strposなどで、"<"を見つけたら、続く">"をスキャンしてみて、 範囲をリストから抽出など。。 $pos_start=strpos($text,"<"); if ($pos_start!==false) { $pos_end=strpos($text,">",$pos_start); // これをしないとそれよりも「前」がヒットするため } あとは、substrなどで、切り出してみれば比較用文字列が取り出せるので、 それをリスト比較ですかね。。 なお、この方法を使うとき、 クオート分解がやや、めんどくさいですけどね。 <tag param="<hoge>"> と、シングルクオートまたはダブルクオート内で<>が使われる可能性があるので。そこをフィルタしつつですかね。

cnkozo
質問者

お礼

ありがとうございました。地道にエスケープします..

その他の回答 (1)

回答No.1

ならば・・・ echo htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); これを、一度変数に押し込みます。 $temp=htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); echo str_replace("&lt;br&gt;", "<br>", $temp); と、質問者さんが変換してほしくなかった場合のみのケースを、 元に戻してあげる!という手はいかがですか?

cnkozo
質問者

お礼

ご回答ありがとうございます。 ただ、テキストも決まった文字列でないのと同時に、HTMLタグも固定ではありません.. また、単なるタグでなく、<script ..ってのもありえます。 全部を置き換え指定するのも非現実的ですよね.. 半角<>を全角<>にするのも何だかな~と。テキスト上では全角にしておいて.. $txt = str_replace("<", "&lt;", $txt); $txt = str_replace(">", "&gt;", $txt); こんな感じでしょうか..

cnkozo
質問者

補足

ご回答ありがとうございます。 ただ、テキストも決まった文字列でないのと同時に、HTMLタグも固定ではありません.. また、単なるタグでなく、<script ..ってのもありえます。 全部を置き換え指定するのも非現実的ですよね.. 半角<>を全角<>にするのも何だかな~と。テキスト上では全角にしておいて.. $txt = str_replace("<", "&lt;", $txt); $txt = str_replace(">", "&gt;", $txt); こんな感じでしょうか..