PHP文字列をJavaScript変数に渡す(および改行をエスケープする)[複製]

StackOverflow https://stackoverflow.com/questions/168214

質問

    

この質問にはすでに回答があります:

         

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

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

通常、JavaScriptはPHPファイル<!>#224で作成します。 la:

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

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

役に立ちましたか?

解決

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

<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>を含む文字列であっても、スクリプトブロックで印刷するために安全にエスケープされることに注意してください。

他のヒント

JSONでエンコード

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

同様の問題が発生しましたが、以下が最善の解決策であることを理解しています:

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

ただし、micahwittmanが投稿したリンクは、いくつかのマイナーなエンコーディングの違い。 PHPのrawurlencode()関数は RFC 1738 に準拠するようになっていますが、そのようなものは存在しないようです。 JavascriptのdecodeURIComponent()を使用します。

妄想バージョン:すべての文字をエスケープする

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(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

または

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

以下のMicahのソリューションは、カスタマイズしなければならなかったサイトがUTF-8でなかったのでうまくいきました。そのため、jsonを使用できませんでした。賛成票を投じますが、担当者は十分ではありません。

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

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

試すことができます

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>

実行しないでください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>
  1. Don <!>#8217; t。 Ajaxを使用するか、HTMLのdata-*属性などに入れてください。インラインスクリプトを使用すると、ページが大きくなります。<!># 8230;

  2. <!>#8230;より安全な関数を作成します:

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

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

これが悪い習慣かどうかはわかりませんが、チームと私はhtml、JS、およびphpの混合ソリューションを使用しています。 JS変数にプルしたいPHP文字列から始めて、呼び出しましょう:

$someString

次に、ページ内の非表示フォーム要素を使用し、その値を文字列として設定します:

<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>

次に、document.getElementByIdを使用してJS変数を定義するという簡単な問題:

<script type="text/javascript" charset="UTF-8">
    var moonUnitAlpha = document.getElementById('phpString1').value;
</script>

これで、JS変数<!> quot; moonUnitAlpha <!> quot;を使用できます。 PHP文字列値を取得したい場所ならどこでも。 これは私たちにとって本当にうまくいくようです。使用頻度が高いかどうかを確認します。

テンプレートエンジンを使用してHTMLを構築する場合は、必要なものを入力できます。

XTemplates をご覧ください。 素晴らしい、オープンソース、軽量のテンプレートエンジンです。

HTML / JSは次のようになります。

<script>
    var myvar = {$MyVarValue};
</script>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top