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)

6voto

Kld Punkte 6718
var myVar = <?php echo json_encode($myVarValue); ?>;

oder

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

1 Stimmen

Sie dürfen den codierten Wert nicht in Anführungszeichen einschließen.

0 Stimmen

Beachten Sie, dass json_encode Schrägstriche escapet, was bedeutet, dass dies niemals versehentlich drucken wird.

0 Stimmen

Wie unterscheidet es sich von der akzeptierten Antwort, die vor 4 Jahren geschrieben wurde?

4voto

Micahs Lösung unten hat für mich funktioniert, da die Website, die ich anpassen musste, nicht in UTF-8 war. Deshalb konnte ich kein JSON verwenden. 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'\\"))); 
}

0 Stimmen

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

3voto

Sie können es in ein verstecktes DIV einfügen, dann den innerHTML des DIV Ihrer JavaScript-Variablen zuweisen. Sie müssen sich keine Gedanken über das Escapen von etwas machen. Achten Sie einfach darauf, kein fehlerhaftes HTML dort hineinzusetzen.

0 Stimmen

"nicht kaputtes HTML dort einfügen", das bedeutet, 'HTML-Entitäten' zu escapen (mindestens '<' und '&')

0 Stimmen

Nein, schließen Sie einfach Ihr Container-DIV nicht vorzeitig.

3voto

Craig Francis Punkte 1705

Nicht ausführen addslashes(); wenn Sie im Kontext der HTML-Seite sind, kann der HTML-Parser immer noch das Tag sehen, auch mitten im String, und annimmt, dass es das Ende des JavaScript ist:

alert(document.cookie);';
?>

    var foo = <?= json_encode($value) ?>; // Verwenden Sie dies
    var foo = '<?= addslashes($value) ?>'; // Vermeiden Sie, erlaubt XSS!

0 Stimmen

Vielleicht mache ich einen dummen Fehler, aber wenn ich diesen Code ausführen möchte, erhalte ich den folgenden Konsolenfehler SyntaxError: expected expression, got '<' NUR wenn ich auf eine externe .js-Datei verweise. Wenn es inline ist, funktioniert es einwandfrei. Gedanken?

0 Stimmen

@RADMKT Nur eine Vermutung, aber wenn es sich um eine .js-Datei handelt, verwendet sie wahrscheinlich kein PHP. Es könnte sich lohnen, die externe JS-Datei im Webbrowser zu laden, um den Codeausgang zu sehen.

3voto

Ry- Punkte 208020
  1. Nicht verwenden Sie Ajax, setzen Sie es in data-* Attribute in Ihrem HTML oder etwas anderes Bedeutungsvolles. Die Verwendung von Inline-Skripts macht Ihre Seiten größer und könnte unsicher oder immer noch Benutzer beeinträchtigen Layout ruinieren, es sei denn…

  2. … Sie eine sicherere Funktion machen:

    function inline_json_encode($obj) {
        return str_replace('

0 Stimmen

Ich bin mir ziemlich sicher, dass

0 Stimmen

@Flimm: Hast du dir den Codepad-Link angesehen? Versuche console.log("<!--<script>")</script><script>console.&zwnj;​log(")/;alert('beliebigen Code hier ausführen');<!---->"), wobei die beiden an console.log übergebenen Zeichenfolgen vom Benutzer stammen (d.h. die Vorlage sieht so aus: console.log({{ s1 }})console.log({{ s2 }}), wo $ s1 und $ s2 von einem fehlerhaften JSON-Encoder stammen). Zugegeben, die zweite Zeichenfolge enthält einen nicht maskierten Schrägstrich, und das Beispiel ist völlig konstruiert, aber ein bösartiger Benutzer könnte immer noch einen Syntaxfehler verursachen.

0 Stimmen

@Flimm: Wie das funktioniert:

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