Przekazać łańcuch PHP do zmiennej JavaScript (i uciec od nowych linii) [duplikat]

To pytanie ma już odpowiedź tutaj:

Jaki jest najprostszy sposób na zakodowanie łańcucha PHP dla wyjścia do zmiennej JavaScript?

Mam ciąg PHP, który zawiera cudzysłowy i nowe linie. Chcę, aby zawartość tego ciągu została umieszczona w JavaScript zmienna.

Normalnie, po prostu skonstruowałbym mój JavaScript w pliku PHP, à la:

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

To jednak nie działa, gdy $myVarValue zawiera cudzysłowy lub nowe linie.

Author: Ry-, 2008-10-03

14 answers

Rozwiń odpowiedź kogoś innego:

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

Użycie json_encode () wymaga:

  • PHP 5.2.0 lub nowszy
  • $myVarValue kodowane jako UTF-8 (lub US-ASCII, oczywiście)

Ponieważ UTF-8 obsługuje pełny Unicode, konwersja powinna być bezpieczna w locie.

Zauważ, że ponieważ json_encode ucieka przed ukośnikami do przodu, nawet łańcuch zawierający </script> będzie bezpieczny dla drukowania z blokiem skryptu.

 473
Author: bobwienholt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 14:53:30

Encode it with JSON

 25
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 18:33:50
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
 19
Author: micahwittman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 18:38:29

Miałem podobny problem i rozumiem, że następujące rozwiązanie jest najlepsze:

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

Jednak link , który opublikował micahwittman, sugeruje, że istnieją pewne niewielkie różnice w kodowaniu. Funkcja PHP rawurlencode() powinna być zgodna z RFC 1738 , podczas gdy wydaje się, że nie było takiego wysiłku w Javascript decodeURIComponent().

 17
Author: pr1001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-14 13:33:39

Wersja paranoiczna:

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: powodem, dla którego json_encode() może nie być właściwe jest to, że czasami trzeba zapobiec wygenerowaniu ", np.

<div onclick="alert(???)" />
 9
Author: giraff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-08 12:45:29
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

Lub

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
 5
Author: Kld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:46:47

Rozwiązanie Micah poniżej działało dla mnie, ponieważ strona, którą musiałem dostosować, nie była w UTF-8, więc nie mogłem użyć json; zagłosowałbym na nią, ale moja reputacja nie jest wystarczająco wysoka.

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
 3
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-18 21:25:34

Htmlspecialchars

Opis

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

Niektóre znaki mają szczególne znaczenie w HTML i powinny być reprezentowane przez encje HTML, jeśli mają zachować swoje znaczenia. Ta funkcja zwraca ciąg znaków z niektórych z tych konwersji wykonane; tłumaczenia wykonane są te najbardziej przydatne dla codziennego programowania web. Jeśli chcesz przetłumaczyć wszystkie encje znaków HTML, użyj metody htmlentities ().

Ta funkcja jest przydatna w zapobieganiu dostarczaniu przez użytkownika tekst zawierający znaczniki HTML, np. w tablicy ogłoszeń lub aplikacji księgi gości.

Wykonywane tłumaczenia to:

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

 2
Author: Chris MacDonald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 18:37:46

Możesz wstawić go do ukrytego DIV, a następnie przypisać innerHTML DIV do zmiennej JavaScript. Nie musisz się martwić o ucieczkę. Tylko upewnij się, że nie umieszczasz tam zepsutego HTML.

 2
Author: Diodeus - James MacFarlane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 18:39:14

Możesz spróbować]}

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
 2
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 18:50:19

Nie uruchamiaj go jednak addslashes(); jeśli znajdujesz się w kontekście strony HTML, parser HTML nadal widzi znacznik </script>, nawet w połowie łańcucha, i zakłada, że jest to koniec 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>
 2
Author: Craig Francis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 18:06:17
  1. Nie. Użyj Ajax, umieść go w atrybutach data-* w HTML, lub coś innego znaczącego. Korzystanie ze skryptów wbudowanych powoduje, że strony są większe, a może być niebezpieczne lub nadal pozwala użytkownikom zniszczyć układ , chyba że ...

  2. ... tworzysz bezpieczniejszą funkcję:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
 2
Author: Ry-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 18:19:06

Nie jestem pewien, czy to zła praktyka, czy nie, ale mój zespół i ja używaliśmy mieszanego rozwiązania html, JS i php. Zaczynamy od ciągu PHP, który chcemy wciągnąć do zmiennej JS, nazwijmy go:

$someString

Następnie używamy na stronie ukrytych elementów formularza, a ich wartość ustawiamy jako ciąg znaków:

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

Następnie jest to prosta sprawa definiowania js var poprzez dokument.getElementById:

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

Teraz możesz użyć zmiennej JS "moonUnitAlpha" gdziekolwiek chcesz pobrać to PHP wartość łańcuchowa. Wygląda na to, że to działa naprawdę dobrze dla nas. Zobaczymy, czy wytrzyma intensywne użytkowanie.

 -2
Author: ioTus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 00:28:00

Jeśli używasz silnika szablonów do konstruowania kodu HTML, możesz wypełnić go tym, co chcesz!

Sprawdź XTemplates . To ładny, otwarty, lekki silnik szablonów.

Twój HTML / JS wyglądałby tak:

<script>
    var myvar = {$MyVarValue};
</script>
 -2
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 09:34:54