如何使用引号连接PHP和JavaScript字符串以进行正确评估

时间:2012-04-14 02:23:53

标签: php javascript eval string-concatenation

我有一页iframed在另一页内。子页面使用sendMessage()函数与父页面通信。父页面对从子页面接收的消息运行eval()。

这是构造消息的代码:

 var msg_string = '$("body").append("<?php echo $content; ?>")';
 var send_string = "sendMessage(\'" + msg_string + "\', '<?php echo $receiver_domain; ?>')";
 setTimeout(send_string, <?php echo $delay; ?>);

其他问题是$ content变量包含HTML,而id =“test”之类的双引号在所有这些连接中都不能很好地发挥作用。我无法想象这一点。

我已经尝试通过将它们转换为“内容来逃避$ content中的引号”但是这导致浏览器将div id放在双引号中(“”test“”)。

**更新**

使用json_encode方法可以将数据传输到父页面。这是一个比我一直做的更容易的解决方案(我已经完成了这么多但是发现了一些不对劲的事情)。也就是说,如果div id =“test”中有双引号,则数据的eval仍然会失败。一串只是“测试”的工作,但它实际上逐字地“测试”。这是使用json方法后html中的javascript源:

 var msg_string = '$("body").append("<div class=\\\"test\\\">HEY WHATS UP<\/div>");';
 var send_string = "sendMessage(\'" + msg_string + "\', 'http://domain.com')";
 setTimeout(send_string,500);

这在评估中失败了。用警报代替eval会产生这样的结果:

 $("body").append("<div class="test">HEY WHATS UP</div>");

有什么想法吗?

**更新2 **

所以我最终想出来了。这是以下三个答案的组合。 json的答案让我失望了。基本上双引号需要被反转,这样当它进入eval时,一切都会被正确读取。

我遇到了一些其他的障碍,包括html中的/ r / n字符...我用str_replace删除了一个撇号...这是一个内部的html元素...我用它替换了适当的html实体和BA​​M!

以下是代码:

 function escapeQuotes(string){
   var quotes_regex = new RegExp("\"", "g");
   return string.replace(quotes_regex, "\\\"");
 }

 var msg_string = '$("body").append(<?php echo json_encode( str_replace("\r\n", '', $content) ); ?>);';
 var send_string = "sendMessage(\'" + escapeQuotes(msg_string) + "\', '<?php echo $receiver_domain; ?>')";
 setTimeout(send_string,<?php echo $delay; ?>);

由于我使用了所有东西,所以我赞成了所有人的答案。非常感谢你!

3 个答案:

答案 0 :(得分:3)

JSON是你的朋友。

var msg_string = '$("body").append(<?php echo json_encode($content); ?>)';

答案 1 :(得分:3)

如果您唯一关注的是双引号,为什么不用转义字符串替换它们?

var msg_string = '$("body").append("<?php echo str_replace("\"", "\\"", $content); ?>")';

我无法准确测试,但这似乎对我有用。

答案 2 :(得分:2)

您需要使用str_replace

进行转义
$search  = array("'", '"');
$replace = array("\'", '\"');
var msg_string = '$("body").append("<?php echo str_replace(search, replace, $content; ?>")';