web-dev-qa-db-ja.com

PHP文字列をJavaScript変数に渡します(そして改行をエスケープします)

JavaScript変数に出力するためのPHP文字列をエンコードする最も簡単な方法は何ですか?

引用符と改行を含むPHP文字列があります。このストリングの内容をJavaScript変数に入れる必要があります。

通常は、JavaScriptをPHPファイルに作成します。

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>

ただし、$myVarValueに引用符または改行が含まれていると、これは機能しません。

361
David Laing

他の人の答えを拡大する:

<script>
  var myvar = <?php echo json_encode($myVarValue); ?>;
</script>

json_encode() を使用するには、

  • PHP 5.2.0以降
  • $myVarValueはUTF-8(またはもちろんUS-ASCII)としてエンコードされています

UTF-8は完全なUnicodeをサポートしているので、その場で変換しても安全なはずです。

json_encodeはスラッシュをエスケープするため、</script>を含む文字列であってもスクリプトブロックで印刷するために安全にエスケープされます。

497
bobwienholt

jSONでエンコードする

26
Javier
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
21
micahwittman

私は同様の問題を抱えており、次のことが最善の解決策であることを理解しています。

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>

しかし、micahwittmanが投稿した リンク は、多少のエンコードの違いがあることを示唆しています。 PHPのrawurlencode()関数は RFC 1738 に準拠していると考えられていますが、JavascriptのdecodeURIComponent()にはそのような努力はなかったようです。

20
pr1001

妄想版: すべての文字をエスケープする

function javascript_escape($str) {
  $new_str = '';

  $str_len = strlen($str);
  for($i = 0; $i < $str_len; $i++) {
    $new_str .= '\\x' . sprintf('%02x', ord(substr($str, $i, 1)));
  }

  return $new_str;
}

編集:json_encode()が適切でない理由は、"が生成されないようにする必要があるためです。

<div onclick="alert(???)" />
10
giraff
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

または

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
6
Kld

私がカスタマイズしなければならなかったサイトはUTF-8ではなかったので、以下のMicahの解決策は私のために働きました、それで私はjsonを使うことができませんでした。私はそれを投票したいのですが、私の担当者は十分に高くありません。

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
5
user291681

あなたはそれを隠しDIVに挿入し、そしてDIVのinnerHTMLをあなたのJavaScript変数に割り当てることができます。あなたは何かをエスケープすることを心配する必要はありません。壊れたHTMLをそこに入れないようにしてください。

addslashes()を実行しないでください。 HTMLページのコンテキスト内にいる場合でも、HTMLパーサーは文字列の途中でも</script>タグを見ることができ、それがJavaScriptの終わりであると想定することができます。

<?php
    $value = 'XXX</script><script>alert(document.cookie);</script>';
?>

<script type="text/javascript">
    var foo = <?= json_encode($value) ?>; // Use this
    var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
3
Craig Francis

あなたが試すことができます

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
3
Jacob
  1. しないでください。 Ajaxを使用するか、HTMLのdata-*属性に含めるか、またはその他の意味のあるものにします。インラインスクリプトを使用すると、ページが大きくなり、 が安全でない場合や、ユーザーがレイアウトを台無しにする可能性がある場合があります

  2. …あなたはより安全な機能を作る:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
3
Ry-

htmlspecialchars

説明

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

特定の文字はHTML内で特別な意味を持ち、それらの意味を維持するためにはHTMLエンティティによって表現されるべきです。この関数は、これらの変換のいくつかを行った文字列を返します。行われた翻訳は、日常のWebプログラミングに最も役立つものです。すべてのHTML文字エンティティを翻訳する必要がある場合は、代わりにhtmlentities()を使用してください。

この機能は、掲示板やゲストブックアプリケーションなど、ユーザー指定のテキストにHTMLマークアップが含まれないようにするのに役立ちます。

実行された翻訳は次のとおりです。

* '&' (ampersand) becomes '&amp;'
* '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
* '<' (less than) becomes '&lt;'
* '>' (greater than) becomes '&gt;'

http://ca.php.net/htmlspecialchars

2
Chris MacDonald