JavaScript或PHP中的撇号转义

4

我在PHP中有一个foreach循环:

var circle_<?php echo $x; ?> = '<?php echo $c; ?>';

在JavaScript中,它返回的是这个:
var circle_0 = '<p class="medium">With us, you can customize more than just a closet.</p>';

var circle_1 = '<p class="medium">We are boutique condo builders who love what we do.</p>';

var circle_2 = '<p class="medium">who says condos can't be spacious?<br/></p>';

如您所见,circle_2字符串中有一个撇号,导致脚本出现错误:

Uncaught SyntaxError: Unexpected token ILLEGAL

我应该使用哪种过滤器来解决这个问题(PHP或JavaScript)?


在PHP程序中生成Javascript数据时,始终使用json_encode()函数。 - Spudley
请参阅:addslashes() - kenorb
3个回答

8

使用 PHP ,您可以尝试:

  <?php echo str_replace("'", "\'",$c);

使用了这种方法,很有效,谢谢。 - user990717

4

这并不一定有效,因为它也会向他的CSS类属性添加反斜杠,例如<p class="medium">。 - TommyBs
@TommyBs 是的,你说得对。我没有提到这种情况。无论如何,Spudley的json_encode()方法确实比任何手工引号转义都要好。 - barbashov

3
不要使用 foreach 循环,也不要使用 addslashes 或其他错误的答案。

请按照以下方式编写您的代码:

echo "var circle = ".json_encode($carray).';';

其中$carray是你当前使用foreach()循环遍历以获取$x$c的数组。

这将创建一个如下所示的Javascript数组:

var circle = [
    '\'<p class="medium">With us, you can customize more than just a closet.</p>\'',
    '\'<p class="medium">We are boutique condo builders who love what we do.</p>\'',
    '\'<p class="medium">who says condos can't be spacious?<br/></p>\''
];

您可以使用circle[0]circle[1]等方式访问元素。

希望对您有所帮助。


只是出于好奇,您能解释一下为什么它们是“不好的答案”,以及为什么您的方法是首选方法吗?我不是在和您争论,但我想看到更多的推理/证明,因为我之前没有看到任何人建议这种方法(再次强调,我不是在争论或不同意,但我想看到一些支持这种方法的东西)。如果所有内容都来自JSON响应,我可以理解,但想知道您是否能提供更多的解释。 - TommyBs
对于其他人来说,我认为我的问题的答案是 - 它更容易维护,更容易阅读,并且转义已经为您完成。它允许您使用js来操作js,而不是有很多交错编码语言(尽管仍然有一个单独的echo语句)。它还将一些处理推送到客户端而不是服务器(在foreach的情况下)-不确定这对大型数组会产生什么性能影响。希望Spudley可以补充更多内容。 - TommyBs
2
@TommyBs:addslashes函数早在JSON被发明之前就已经被加入到PHP语言中,而且并不能转义JSON所需的所有字符。因此,尽管它可以用于问题中给出的示例,但不能保证在所有情况下都能正常工作;例如,如果他决定使用换行符格式化HTML。此外,问题说明他正在使用foreach循环为PHP数组中的每个元素生成单独命名的JavaScript变量。这不是最佳实践;最好输出一个JavaScript数组。只需要一个json_encode()调用即可。 - Spudley
2
@TommyBs - 在你的评论中进一步解释“它将处理推到客户端”的说法-并不完全正确。在JavaScript中拥有大量命名变量的开销比将它们放在数组中要高,特别是如果他的JS代码然后尝试使用子字符串构建变量名称来访问变量。考虑到他格式化名称的方式,我希望情况是这样的,但这肯定会比简单的数组更糟糕地影响他的JS性能。 - Spudley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接