Сгенерированный PHP javascript и кавычки

Я создаю некоторый javascript в своем PHP-коде, и мне нужно назначить некоторые переменные php переменным javascript. К сожалению, иногда мои переменные PHP содержат кавычки. например:

$foo = "'Dis here be a \"string\"";
print "<script type='text/javascript'>var foo = '{$foo}';</script>";

будет генерировать ошибку javascript, потому что результирующий javascript будет выглядеть так:

<script type='text/javascript'>var foo = '"'Dis here be a \"string\"';

Я знаю, что могу использовать регулярное выражение для $foo, чтобы заменить все отметки ' на \', но это сложно по разным причинам. Есть ли что-нибудь, что я могу сделать, кроме этого? Что-то похожее на функцию perl q()...


person Igor Serebryany    schedule 19.11.2009    source источник
comment
Каковы некоторые из этих различных причин?   -  person bcat    schedule 19.11.2009
comment
У вас включены волшебные кавычки? Это может быть проблемой.   -  person jtbandes    schedule 19.11.2009
comment
различные причины заключаются в том, что этот js генерируется шаблоном smarty, а smarty не позволяет вам использовать полный php, но {$foo|addslashes} делает свое дело   -  person Igor Serebryany    schedule 19.11.2009


Ответы (7)



Я использую json_encode().

http://ie2.php.net/manual/en/function.json-encode.php

person TRiG    schedule 19.11.2009

Это должно быть шагом в правильном направлении:

addcslashes($str, "\"\r\n\\\t/\0..\37");
person Frank Farmer    schedule 19.11.2009

Ты уверен? Не так ли:

var foo = ''Dis here be a "string"'

Чтобы предотвратить двойную попытку:

$foo = "\'Dis here be a \"string\"";

or

$foo = '\\\'Dis here be a "string"';
person powtac    schedule 19.11.2009

Также стоит отметить, что вы можете использовать файл PHP как файл JavaScript.

<script type="text/javascript" src="js/main.php"></script>

И вы можете выполнять код PHP в этом файле, а также выводить код JavaScript, повторяя из PHP.

person Derek H    schedule 19.11.2009

Поскольку вы используете окончательное значение в JavaScript, я бы использовал json_encode:

$foo = "'Dis here be a \"string\"";
print "<script type='text/javascript'>var foo = " . json_encode($foo) . ";</script>";

И он будет правильно выводить:

<script type='text/javascript'>var foo = "'Dis here be a \"string\"";</script>

Заметьте, я не заключал в дополнительные кавычки функцию json_encode. Он добавит необходимые кавычки, чтобы автоматически сделать его действительной строкой JavaScript.

person Doug Neiner    schedule 19.11.2009

Ответ Фрэнка Фармера интересен, но он избегает некоторых вещей, которые не нужно экранировать, например табуляции.

Попробуйте этот фрагмент, он отлично работает:

<script type="text/javascript">
    alert("Hi!\n\tHi!\n<?php echo '\tHI!',"\\n\tHI!";?>");
</script>

Поскольку я всегда подключаюсь к базе данных в своих PHP-скриптах, которые передают текст непосредственно в строки Javascript, я полагаюсь на real_escape_string для выполнения своей грязной работы. addlashes() не обрабатывает новые строки, и они иногда проникают в строки, которые я передаю в Javascript.

Простой $sql->real_escape_string($string) делает все лучше, выводя все, что выдает база данных, в удобную для Javascript форму.

person Eric L.    schedule 31.01.2013