7

既に存在するエンティティに影響を与えることなく、エンコードされていない文字のみを html エンティティに変換したい。以前にエンティティをエンコードした文字列があります。

gaIUSHIUGhj>‐ hjb×jkn.jhuh>hh> …

を使用するhtmlentities()と、&エンティティの先頭にある が再びエンコードされます。これは‐、他のエンティティが次のように&エンコードされていることを意味し&ます。

×

完全な文字列をデコードしてから、もう一度エンコードしようとしましたが、正しく機能していないようです。これは私が試したコードです:

header('Content-Type: text/html; charset=iso-8859-1');
...

$b = 'gaIUSHIUGhj>‐ hjb×jkn.jhuh>hh> …';
$b = html_entity_decode($b, ENT_QUOTES, 'UTF-8');
$b = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $b);
$b = htmlentities($b, ENT_QUOTES, 'UTF-8'); 

しかし、それは正しい方法ではないようです。これを防止または停止する方法はありますか?

4

2 に答える 2

6

オプションの$double_encode変数を に設定しますfalse。詳細については、ドキュメントを参照してください。

結果のコードは次のようになります。

$b = htmlentities($b, ENT_QUOTES, 'UTF-8', false);
于 2013-03-09T03:52:56.830 に答える
5

あなたはドキュメンテーションをよく見ましたが、最良の部分を見逃しました。これを解読するのは難しい場合があります。

//     >    >    >    >    >    >    Scroll    >>>    >    >    >    >    >     Keep going.    >    >    >    >>>>>>  See below.  <<<<<<
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

一番最後まで見てください。

知っている。紛らわしい。私は通常、署名欄を無視して、次のブロック ( Parameters) に直接進み、各引数の宣伝文を表示します。

したがってdouble_encoded、最後に引数を使用して、htmlentities再エンコードしないように指示する必要があります (特に、再エンコードしUTF-8ない理由がない限り、そのまま使用することをお勧めします)。

$str = "gaIUSHIUGhj>&hyphen; hjb&times;jkn.jhuh>hh> &hellip;";

// Double-encoded!
echo htmlentities($str, ENT_COMPAT, 'utf-8', true) . "\n";

// Not double-encoded!
echo htmlentities($str, ENT_COMPAT, 'utf-8', false);

https://ignite.io/code/513ab23bec221e4837000000

于 2013-03-09T03:59:41.697 に答える