Übergeben Sie einen PHP-String in einem JavaScript-Variable (und Flucht newlines) [Duplicate]

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

Frage

    

Diese Frage bereits eine Antwort hier:

         

Was ist der einfachste Weg, einen PHP-String für die Ausgabe an ein JavaScript-Variable?

zu kodieren

Ich habe einen PHP-String, die Anführungszeichen und Zeilenumbrüche enthält. Ich brauche den Inhalt dieser Zeichenfolge in einen JavaScript-Variable werden.

Normalerweise würde ich meine JavaScript in einer PHP-Datei nur konstruieren, à la:

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

Dies ist jedoch nicht funktioniert, wenn $myVarValue Anführungszeichen oder Zeilenumbrüche enthält.

War es hilfreich?

Lösung

Die Erweiterung auf jemandem andere Antwort:

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

Mit json_encode () erfordert:

  • PHP 5.2.0 oder höher
  • $myVarValue codiert als UTF-8 (oder US-ASCII, natürlich)

Da UTF-8 voll Unicode unterstützt, sollte es sicher sein on the fly zu konvertieren.

Beachten Sie, dass, weil json_encode Slashes entkommt, auch eine Zeichenfolge, die </script> sicher zum Drucken mit einem Script-Block entkommen wird enthält.

Andere Tipps

kodieren es mit JSON

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

Ich habe ein ähnliches Problem habe und zu verstehen, dass die folgende ist die beste Lösung:

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

Doch die Link dieser micahwittman geschrieben schlägt vor, dass es einige kleinere Codierung Unterschiede. PHP rawurlencode() Funktion soll mit RFC 1738 erfüllen, während es scheint gewesen zu sein, eine solche Anstrengung mit Javascript ist decodeURIComponent().

Die paranoiden Version. jedes einzelne Zeichen Escaping

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;
}

EDIT: Der Grund, warum json_encode() nicht geeignet sein kann, ist, dass manchmal, müssen Sie " verhindern erzeugt werden, z.B.

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

oder

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

Michas Lösung unter arbeitete für mich als die Seite, die ich anpassen musste, war nicht in UTF-8, so kann ich nicht json verwenden; Ich würde es stimmen, aber mein rep nicht hoch genug ist.

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

Sie können es in einem versteckten DIV einlegen, dann die Innerhtml des DIV zu Ihrem JavaScript Variablen zuweisen. Sie müssen sich keine Sorgen über irgendetwas zu entkommen. Nur sicher sein, nicht gebrochen HTML in dort zu setzen.

Sie könnten versuchen,

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

Sie führen Sie es nicht, obwohl addslashes(); wenn Sie im Rahmen der HTML-Seite sind, dann kann der HTML-Parser sieht immer noch den </script> Tag, sogar Mitte der Saite, und annimmt, dass es das Ende des JavaScript ist:

<?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. Sie nicht. Verwenden Sie Ajax, steckt es in data-* Attributen in Ihrem HTML, oder etwas anderes sinnvoll. Inline-Skripten macht Ihre Seiten größer, und unsicher sein könnte oder noch können Benutzer das Layout ruinieren, es sei denn ...

  2. ... Sie eine sicherere Funktion machen:

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

htmlspecialchars

Beschreibung

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

Bestimmte Zeichen haben eine besondere Bedeutung in HTML und sollen von der HTML-Code dargestellt werden, wenn sie ihre Bedeutung behalten. Diese Funktion gibt eine Zeichenfolge mit einigen dieser Umwandlungen gemacht; die Übersetzungen gemacht sind die nützlichsten für die tägliche Web-Programmierung. Wenn Sie alle HTML-Entitäten benötigen übersetzt werden, verwenden Sie htmlentities () statt.

Diese Funktion ist bei der Verhinderung vom Benutzer gelieferten Textes von HTML-Code, wie in einem Forum oder Gästebuch Anwendung nützlich.

Die Übersetzungen durchgeführt werden:

* '&' (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

Ich bin mir nicht sicher, ob diese schlechte Praxis ist oder nicht, aber mein Team und ich haben eine gemischten HTML, JS, und PHP-Lösung im Einsatz. Wir beginnen mit der PHP-String wir in eine JS Variable ziehen wollen, lässt es nennen:

$someString

Als nächstes verwenden wir in-Seite versteckte Formularelemente und hat ihren Wert als Zeichenfolge festgelegt:

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

Dann ist es eine einfache Sache, eine JS var durch document.getElementById definieren:

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

Jetzt können Sie die JS-Variable „moonUnitAlpha“ verwenden wo immer Sie wollen, dass die PHP-String-Wert greifen. Dies scheint für uns wirklich gut zu funktionieren. Wir werden sehen, ob es bis zu starkem Gebrauch hält.

Wenn Sie einen Template-Engine verwenden, um Ihre HTML zu konstruieren, dann können Sie es mit füllen, was auch immer Sie wollen!

Schauen Sie sich XTemplates . Es ist eine schöne, Open Source, leicht, Template-Engine.

Ihre HTML / JS es würde wie folgt aussehen:

<script>
    var myvar = {$MyVarValue};
</script>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top