401 Stimmen

Übergeben Sie eine PHP-Variable an eine JavaScript-Variable

Was ist der einfachste Weg, um einen PHP-String für die Ausgabe in einer JavaScript-Variablen zu codieren?

Ich habe einen PHP-String, der Anführungszeichen und Zeilenumbrüche enthält. Ich muss den Inhalt dieses Strings in eine JavaScript-Variablen einfügen.

Normalerweise würde ich einfach mein JavaScript in einer PHP-Datei erstellen, wie folgt:

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

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

2 Stimmen

Wollte nur darauf hinweisen, dass Sie utf8_encode() verwenden können, bevor Sie den String an json_encode übergeben. Das mache ich: echo json_encode(utf8_encode($msg));

1 Stimmen

Dies ist kein Duplikat von stackoverflow.com/questions/23740548/…. Der letztere spricht über AJAX usw. und Netzwerkfragen, während es hier um Encoding/Escaping/Anführungszeichen und Zeilenumbrüche geht. Können wir das wieder öffnen? (Übrigens ist hier die angenommene Antwort kurz, funktioniert gut und hat viele Hunderte von Stimmen)

555voto

bobwienholt Punkte 17040

Erweiterung der Antwort einer anderen Person:

  var myvar = <?= json_encode($myVarValue, JSON_UNESCAPED_UNICODE); ?>;

Die Verwendung von json_encode() erfordert:

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

Da UTF-8 volle Unicode-Unterstützung bietet, sollte es sicher sein, es direkt umzuwandeln.

Bitte beachten Sie, dass wenn Sie dies in HTML-Attributen wie onclick verwenden, Sie das Ergebnis von json_encode an htmlspecialchars() übergeben müssen, wie folgt:

htmlspecialchars(json_encode($string), ENT_QUOTES);

Sonst könnten Probleme auftreten, z.B. wird &bar; in foo()&&bar; als HTML-Entity interpretiert.

10 Stimmen

Wenn Sie UTF-8 verwenden, ist das mit Abstand die beste Lösung.

4 Stimmen

Es ist wichtig, dass die Implementierung von json_encode den Schrägstrich umgeht. Wenn dies nicht der Fall wäre, würde es nicht funktionieren, wenn $myVarValue "" wäre. Aber json_encode umgeht Schrägstriche, also sind wir gut.

0 Stimmen

Wenn Sie nicht 5.2 sind, versuchen Sie jsonwrapper von boutell.com boutell.com/scripts/jsonwrapper.html

27voto

Javier Punkte 58737

Codiere es mit JSON

0 Stimmen

Wahrscheinlich der einfachste Weg, um sicherzustellen, dass dies 100% der Zeit funktioniert. Sonst gibt es einfach zu viele Fälle zu berücksichtigen.

0 Stimmen

Json funktioniert nur mit UTF-8-Zeichensatz. Daher ist es keine Lösung, wenn Ihre Website in einem nicht UTF-8-codierten Format arbeitet

4 Stimmen

@nir: Einerseits kenne ich keinen Grund, einen anderen Encoding zu verwenden, andererseits übernimmt ein vollständiger JSON-Encoder auch die erforderliche Zeichencodierung.

24voto

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

0 Stimmen

Ich brauchte diese, weil ich den Inhalt der Variable als Teil eines verketteten JavaScript-Ausdrucks verwendet habe.

0 Stimmen

Dies hat mir wirklich geholfen.

22voto

pr1001 Punkte 21131

Ich hatte ein ähnliches Problem und verstehe, dass folgendes die beste Lösung ist:

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

Dennoch deutet der von micahwittman gepostete Link darauf hin, dass es einige geringfügige Kodierungsunterschiede gibt. Die rawurlencode() Funktion von PHP soll dem RFC 1738 entsprechen, während es anscheinend keine entsprechenden Bemühungen bei decodeURIComponent() in Javascript gab.

0 Stimmen

decodeURIComponent entspricht meiner Meinung nach RFC 3986.

0 Stimmen

Dies ist die richtige Lösung, wenn Sie große Zeichenfolgen analysieren (z. B. HTML-Inhalt als Zeichenfolge)

0 Stimmen

@RaduGheorghies Warum?

12voto

giraff Punkte 4359

Die paranoide Version: Jedes einzelne Zeichen escapen.

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() möglicherweise nicht geeignet ist, ist dass manchmal verhindert werden muss, dass " generiert wird, z.B.

0 Stimmen

Das Entfernen jedes einzelnen Zeichens hat bei mir funktioniert. json_encode kommt mit Backslashes nicht sehr gut zurecht. Wenn Sie etwas wie einen regulären Ausdruck von MySQL als Parameter an JavaScript übergeben müssen, scheint dies der beste Weg zu sein.

0 Stimmen

@kristoffer-ryhl bemerkt zu Recht, dass dechex nicht für '\t' funktioniert (= '\x08'), also habe ich es bearbeitet, um sprintf zu verwenden. Allerdings scheint dies immer noch nicht für UTF-8-Zeichen zu funktionieren (dies würde '\u' erfordern) ...

0 Stimmen

Für ein HTML-Attribut kannst du Folgendes tun

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X