2017-02-05 5 views
2

)」を示すないもののコードが;)ある奇妙な何もそれを解析するために、私が入力した場合、私は、コマンド;)を使用したとき、私はいくつかのエモートでフォーラムサイトを運営

$text = str_ireplace(array(";)", ";-)", "^wink^"), "<img src='/images/emotes/wink.png' style='height: 30px;width:30px; vertical-align:text-top;'>", $text); 

を(申し訳ありませんが、使用エモート。。。何か間違って私はコピー&ペーストしませんでした今)

すべてが素晴らしい作品が、私は例のコード提供しようとしたとき:。

function("mind"); 

を私はお返しにこれを得た:

機能(「心」画像);

私はなぜそれが起こったのだろうと思っていました。私は他のウェブページ(mrush.net)でも見ました。 ")と入力した場合にのみ発生しますが、)と置き換えられます。引用符はそのままです。

これには何か説明がありますか?

+0

このサイトの規約は、質問と回答を厳密に分離することですte;解決方法を含めるように質問を編集するのではなく、[あなた自身の質問に答えることを奨励する](http://stackoverflow.com/help/self-answer)です。 – IMSoP

答えて

4

問題は、すでにhtmlspecialcharsなどでエスケープしたHTML文字列内を置き換えることで、引用符を&quot;としてエスケープすることです。だから、順序は次のとおりです。

  1. ユーザーの種類")
  2. エスケープ関数が&quot;)
  3. としてこれをエスケープ置換は;)を見て、出力&quot<img...>
  4. ブラウザは、&quotを見て、あなたが&quot;を意味想定しています引用符と画像を表示する

これは難しいの代わりに HTMLエスケープを適用することはできません。イメージに実際のHTMLを挿入するためです。

一つのアプローチは、例えば、あなたの長い形式^wink^をあいまいでプレースホルダを使用することです:

  1. <img...>
  2. ^wink^
  3. エスケープHTML
  4. 代替^wink^;)のインスタンスを置き換えます
+1

@Soaku ';'は 'htmlspecialchars'または' htmlentities'で ';'に変換されないので、あなたのソリューションの仕組みは完全にはわかりません。可能なさまざまな入力をカバーするためにいくつかのテストケースを記述してください。私は問題を特定するのを手伝ってくれてうれしいです。 – IMSoP

+0

これはもっと難しいです...^wink ^と置き換えてもどうすればいいでしょうか?) – Soaku

+0

@Soaku HTMLをまだエスケープしていない場合は処理しません;処理の順序はここの重要なこと。 – IMSoP

関連する問題