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

Lesezeit: 6 Minuten

Benutzeravatar von David Laing
David Laig

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

Ich habe eine PHP-Zeichenfolge, die Anführungszeichen und Zeilenumbrüche enthält. Ich brauche den Inhalt dieser Zeichenfolge, um in eine JavaScript-Variable eingefügt zu werden.

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

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

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

  • Ich wollte nur darauf hinweisen, dass Sie verwenden können utf8_encode() bevor Sie die Zeichenfolge an übergeben json_encode. Das ist was ich tue: echo json_encode(utf8_encode($msg));

    – Carloswini

    11. September 2013 um 18:00 Uhr


  • Das ist nicht ein Duplikat von stackoverflow.com/questions/23740548/…. Letzteres spricht über AJAX etc. und Netzwerkfragen, während es hier um Codierung/Escapezeichen/Anführungszeichen und Zeilenumbrüche geht. Lass uns wieder öffnen? (Übrigens, hier ist das Akzeptiert kurz, funktioniert gut und hat viele hundert Stimmen)

    – Basj

    1. Dezember 2021 um 12:19 Uhr


Benutzeravatar von bobwienholt
Bobwienholt

Erweiterung der Antwort eines anderen:

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

Verwenden json_encode() erfordert:

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

Da UTF-8 Unicode vollständig unterstützt, sollte es sicher sein, es im laufenden Betrieb zu konvertieren.

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

htmlspecialchars(json_encode($string), ENT_QUOTES);

sonst könnten Sie Probleme bekommen mit z.B. &bar; In foo()&&bar; als HTML-Entität interpretiert werden.

  • Wenn Sie UTF-8 verwenden, ist das bei weitem die beste Lösung.

    – Körnel

    13. Oktober 2008 um 23:02 Uhr

  • Es ist wichtig, dass die Implementierung von json_encode den Schrägstrich maskiert. Wenn dies nicht der Fall wäre, würde dies nicht funktionieren, wenn $myVarValue “” wäre. Aber json_encode entgeht Schrägstrichen, also sind wir gut.

    – Zeichnete LeSueur

    1. Oktober 2010 um 19:40 Uhr


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

    – Tom Auger

    22. Dezember 2010 um 22:57 Uhr


  • Bitte beachten Sie, wenn Sie dies in verwenden onclick Attribute und dergleichen, müssen Sie das Ergebnis übergeben json_encode Zu htmlspecialcharswie folgt: htmlspecialchars(json_encode($string),ENT_QUOTES,'utf-8') sonst könnten Sie Probleme bekommen mit z.B. &bar; In foo()&&bar; als HTML-Entität interpretiert werden.

    – Benutzer2428118

    2. Juni 2014 um 14:09 Uhr

  • @hakre: Aber wie PHP-String enthält "...</script>..." kann JS Non-String werden </script> statt nur JS-String "...</script>..." nach json_encode von PHP? Es fügt immer Anführungszeichen für Zeichenfolgen hinzu. So, var x = "...</script>..."; ist nur ein JS-String. Keine Pause.

    – Flammensturm

    27. Juli 2017 um 14:21 Uhr


codiere es mit JSON

  • Wahrscheinlich der einfachste Weg, dies zu 100% zum Laufen zu bringen. Es gibt zu viele Fälle, um sie anderweitig abzudecken.

    – willasaywhat

    3. Oktober 2008 um 18:42 Uhr

  • Json funktioniert nur mit UTF-8 Charset. Es ist also keine Lösung, wenn Ihre Website in einer Nicht-UTF-8-Kodierung arbeitet

    – Nein

    27. April 2009 um 12:06 Uhr

  • @nir: Einerseits kenne ich keinen Grund, eine andere Codierung zu verwenden, andererseits verwaltet ein vollständiger JSON-Encoder auch die erforderliche Zeichensatzkonvertierung

    – Javier

    28. April 2009 um 2:03 Uhr

  • Es reicht nicht aus, es mit JSON zu codieren, Sie müssen auch sicherstellen, dass jede Javascript-Zeichenfolge, die enthält </script> (Groß-/Kleinschreibung wird nicht beachtet) richtig behandelt wird.

    – Flimmer

    13. November 2015 um 15:03 Uhr

  • Das Codieren eines einzelnen Skalarwerts mit JSON zwingt ihn nicht zu einem Objekt – Sie erhalten nur eine UTF-8-Zeichenfolge. Nehmen wir zum Beispiel an, Ihr PHP-Code sieht so aus: $x=”“; und Ihr HTML sieht so aus: das Ergebnis beim Durchsuchen ist: Beachten Sie die doppelten Anführungszeichen und den maskierten Schrägstrich.

    – Craig Jacobs

    7. Januar 2017 um 21:20 Uhr

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

  • Ich brauchte dieses, weil ich den Inhalt der Variablen als Teil eines verketteten Javascript-Ausdrucks verwendete.

    – Phil Cairns

    22. Februar 2018 um 20:27 Uhr

  • Das hat mir wirklich geholfen.

    – Austin

    17. Februar 2019 um 3:37 Uhr

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

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

Allerdings ist die Verknüpfung dass micahwittman gepostet hat, deutet darauf hin, dass es einige geringfügige Codierungsunterschiede gibt. PHPs rawurlencode() Funktion entsprechen soll RFC-1738während es bei Javascript anscheinend keine solchen Bemühungen gegeben hat decodeURIComponent().

Benutzeravatar von giraff
Giraffe

Die paranoide Version: Jedem einzelnen Zeichen entkommen.

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

BEARBEITEN: Der Grund warum json_encode() möglicherweise nicht angemessen ist, dass Sie manchmal verhindern müssen " zu erzeugen, z

<div onclick="alert(???)" />

  • Jedem einzelnen Charakter zu entkommen, hat für mich funktioniert. json_encode verarbeitet Backslashes nicht sehr gut. Wenn Sie so etwas wie einen regulären Ausdruck von MySQL an Javascript als Parameter übergeben müssen, scheint dies der beste Weg zu sein.

    – Ekim

    22. Mai 2012 um 4:05 Uhr

  • @kristoffer-ryhl bemerkt richtig, dass dechex nicht für ‚\t‘ (= ‚\x08‘) funktioniert, also habe ich es bearbeitet, um sprintf zu verwenden. Dies scheint jedoch immer noch nicht für UTF-8-Zeichen zu funktionieren (dies würde stattdessen die Verwendung von '\u' erfordern) ...

    – Giraffe

    8. November 2015 um 12:47 Uhr

  • Für ein HTML-Attribut könnten Sie tun <div onclick="alert(<?php echo htmlspecialchars(json_encode($var));?>" />

    – Flimmer

    13. November 2015 um 14:55 Uhr

  • Dies ist keine Unicode-Speicherung, überprüfen Sie dies: docs.laminas.dev/laminas-escaper/escaping-javascript

    – Winsa

    28. Mai 2020 um 16:46 Uhr

Benutzeravatar von Salman A
Salmann A

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

oder

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

  • Jedem einzelnen Charakter zu entkommen, hat für mich funktioniert. json_encode verarbeitet Backslashes nicht sehr gut. Wenn Sie so etwas wie einen regulären Ausdruck von MySQL an Javascript als Parameter übergeben müssen, scheint dies der beste Weg zu sein.

    – Ekim

    22. Mai 2012 um 4:05 Uhr

  • @kristoffer-ryhl bemerkt richtig, dass dechex nicht für ‚\t‘ (= ‚\x08‘) funktioniert, also habe ich es bearbeitet, um sprintf zu verwenden. Dies scheint jedoch immer noch nicht für UTF-8-Zeichen zu funktionieren (dies würde stattdessen die Verwendung von '\u' erfordern) ...

    – Giraffe

    8. November 2015 um 12:47 Uhr

  • Für ein HTML-Attribut könnten Sie tun <div onclick="alert(<?php echo htmlspecialchars(json_encode($var));?>" />

    – Flimmer

    13. November 2015 um 14:55 Uhr

  • Dies ist keine Unicode-Speicherung, überprüfen Sie dies: docs.laminas.dev/laminas-escaper/escaping-javascript

    – Winsa

    28. Mai 2020 um 16:46 Uhr

Benutzeravatar von SLaks
SLaks

Die Lösung von Micah unten funktionierte für mich, da die Site, die ich anpassen musste, nicht in UTF-8 war, sodass ich json nicht verwenden konnte. Ich würde dafür stimmen, aber mein Ruf ist nicht hoch genug.

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

  • Ich auch! Diese zwei Codezeilen sind das Beste, was PHP passiert ist (zumindest meiner Meinung nach). Vielen Dank!!

    – rizalp1

    26. Oktober 2012 um 3:44 Uhr

1449540cookie-checkÜbergeben Sie eine PHP-Variable an eine JavaScript-Variable

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy