PHP программисты иногда сталкиваются с проблемами при попытке динамически генерировать JavaScript код. Проблема заключается в использовании некоторых символах одновременно в JavaScript, а также в PHP. Это условие может несколько усложнить нам жизнь, но выход найти можно.
Избавляемся от кавычек и символов перевода строки.
Предположим мы работаем с PHP переменной, которая должна быть выведена с помощью функции alert в JavaScript.
$str = «небольшой фрагмент текста
разбитый более чем на одну строку
и содержащий «двойные» и `одиночные` кавычки»;
Чтобы вывести сообщение, содержащееся в переменной $str в JavaScript напрашивается решение вида:
<script type="text/javascript"> alert("<?php echo $str; ?>"); </script>
что приводит к ошибке в коде в JavaScript:
<script type="text/javascript"> alert("небольшой фрагмент текста разбитый более чем на одну строку и содержащий "двойные" и `одиночные` кавычки "); </script>
Во-первых, разделители строки в JavaScript не работают, их нужно заменить на \n (символ представляющий перевод строки). Во-вторых, двойные кавычки внутри текста конфликтуют с внешними кавычками при вызове alert.
С учетом выше сказанного вот код, который будет работать корректно:
<script type="text/javascript"> alert("<?php echo preg_replace("/\r?\n/", "\\n", addslashes($str));?>"); </script>
Как видим нам понадобились две функции PHP:
preg_replace — поиск и замена по регулярному выражению
addslashes — экранирует строку с помощью слэшей, возвращает строку, в которой перед каждым спецсимволом добавлен обратный слэш
Если мы выводим сообщение из PHP кода нам необходимо будет сделать следующее:
$str = preg_replace("/\r?\n/", "\\n", addslashes($str)); echo "<script type="text/javascript"> "; echo " alert("$str"); "; echo "</script> ";
или
<?php $str = preg_replace("/\r?\n/", "\\n", addslashes($str)); ?> <script type="text/javascript">; alert("<?php echo $str; ?>"); </script>;
В результате получим:
<script type="text/javascript"> alert("небольшой фрагмент текста\n разбитый более чем на одну строку\n и содержащий \" двойные \" и \`одиночные\` кавычки "); </script>
Этот же самый подход может быть использован во многих схожих ситуациях где из PHP необходимо передать переменную в JavaScript.
При попытке отладить этот код следует проверить его работоспособность в JavaScript (современные браузеры имеют встроенные отладчики) и только потом посмотреть как код может быть получен из PHP.
Примечание: нет необходимости дополнительно преобразовывать символы & и « к их эквивалентным кодам объекта HTML, так как JavaScript — это независимый от HTML язык и умеет без проблем работать с этими символами.