1

文字のエスケープに関する問題に遭遇しましたが、それはまったく単純ではないと思います。これが JavaScript で行われている場合は、言うことはありませんが、コンテキストは (PHP で) echo コマンドを使用して、次のような JavaScript コードを記述しています。

echo "<script>document.getElementById('spanID').innerHTML=\"$x\"</script>";

$x は PHP 環境の変数で、一重引用符と二重引用符の両方を含めることができます。ここで行うことは次のとおりです。 1. $x を変更しないでください。$x に二重引用符が含まれている場合、上記のコードは機能しません。エコーされるテキストは次のようになります。

<script>document.getElementById('spanID').innerHTML="leftside"rightside"</script>;

$x = leftside" rightside だと思っていたのですが、うまくいかないことがわかります。

  1. $x の二重引用符をエスケープします (すべての " を

    "
    )、エコーされたテキストは次のようになります。

    document.getElementById('spanID').innerHTML="leftside

    "
    右側";

"
Span の innerHTML 属性に割り当てられた場合 (たとえば)、" に変換されないため、必要な代わりに、SPAN の innerHTML は左側にする必要があります"右側、左側になります
"
右側。

元のエコーで " を ' に変更すると、次のようになります。

echo "<script>document.getElementById('spanID').innerHTML='$x'</script>";

ここの $x には一重引用符と二重引用符の両方を含めることができるため、同じです。

この場合、引用符をエスケープする他の方法は見つかりません。助けていただけませんか?

ありがとう!

4

1 に答える 1

2

有効な (そして安全な) HTML を含む JavaScript の有効な文字列である文字列を引用符で囲む必要があります。

最善の選択肢は、使用innerHTMLせずに使用document.createTextNodeすることです。これは、コンテンツをスラッシュエスケープするだけでよいことを意味します。

それ以外の場合は、HTML エスケープしてから、コンテンツをスラッシュ エスケープする必要があります。正確を期すために、スラッシュ エスケープ関数は、少なくとも二重引用符、バックスラッシュ、およびすべての JavaScript 改行 (U+A、U+D、U+2028、U+2029) をエスケープする必要があります。PHPaddslashesはデフォルトでU + 2028またはU + 2029を処理しないと思いますが、Javascript用にPHPから文字列をエスケープするにはどうすればよいですか? にはいくつかの代替手段があります。

すべてをまとめるには:

$x_escaped = json_encode($x, JSON_HEX_TAG);

echo "<script>document.getElementById('spanID').appendChild(document.createTextNode($x_escaped))</script>"

するべきです。JSON_HEX_TAG は、スクリプト タグを途中で終了するコンテンツやその他のコンテンツを $x_escaped含まないことを確認します。になります。</script></script>\u003c/script\u003e

于 2012-12-05T16:12:04.943 に答える