一个始终存在的问题是, 在客户端与PHP进行PHP与JavaScript进行通信的方式会导致字符串中包含特殊字符, 这可能会使JS代码完全崩溃。例如, 看下面的代码:
<?php
$str = <<<EOF
Test
String
EOF;
?>
<script>
var myString = "<?php echo $str ?>";
</script>
如果此代码是由JS引擎处理的, 例如在浏览器中, 你将看到以下异常:
确实, PHP中的字符串有多行, 并且也以相同的方式打印。需要对字符串进行转义, 即替换可能污染JavaScript的特殊字符, 以使其适合JavaScript。在本文中, 我们将向你展示使用Symfony帮助器在JavaScript上下文中安全地从PHP安全打印字符串的过程。
从PHP安全地将字符串打印到JavaScript
幸运的是, Symfony 1.4并未包含可能没人会理解的复杂方法, 而是包含了许多帮助程序, 例如DateHelper, NumberHelper, UrlHelper等。这样的助手提供了许多开发人员经常使用的方法。这些帮助程序之一就是Escaping帮助程序, 正如其名称所称, 它包含两种方法, 可用于在不同情况下转义字符串的特殊字符。要将此帮助程序包含在你的视图/操作中, 你可以简单地使用use_helper方法和该帮助程序的名称作为第一个参数, 在这种情况下, 它是转义帮助程序:
<?php use_helper("Escaping"); ?>
这将允许你在加载了帮助程序的地方使用不同的纯PHP函数。 esc_js_no_entities方法是我们需要在JavaScript上下文中安全地从PHP打印字符串的一种方法, 此方法转义字符串, 使其适合放置在JavaScript字符串中。它返回转义的值, 所以不是打印变量, 而是打印将字符串作为第一个参数传递的方法返回的值:
<?php // Include the Escaping Helper of Symfony 1.4 ?>
<?php use_helper("Escaping"); ?>
<?php
$str = <<<EOF
Test
String
EOF;
?>
<script>
var myString = "<?php echo esc_js_no_entities($str) ?>";
</script>
PHP将打印以下标记:
<script>
var myString = " Test\n String";
</script>
快速和功能不是吗?在转义帮助程序的方法集合中, 还有更多有用的转义方法, 例如esc_specialchars, esc_raw, 因此请不要忘记在此处查看该帮助程序的官方旧版文档。
编码愉快!
评论前必须登录!
注册