Przekazać łańcuch PHP do zmiennej JavaScript (i uciec od nowych linii) [duplikat]
To pytanie ma już odpowiedź tutaj:
- Jak przekazać zmienne i dane z PHP do JavaScript? 18 odpowiedzi
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.
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.
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
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'\\")));
}
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()
.
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
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(???)" />
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>
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'\\")));
}
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 '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
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.
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>
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>
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
-
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 ... -
... tworzysz bezpieczniejszą funkcję:
function inline_json_encode($obj) { return str_replace('<!--', '<\!--', json_encode($obj)); }
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.
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>
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