2012-04-14 103 views
3

我有一個頁面在另一個頁面內部放置。子頁面通過使用sendMessage()函數與父頁面進行通信。父頁面對從子頁面接收到的消息運行eval()。如何使用引號連接PHP和JavaScript字符串以正確評估

這是構建信息代碼:

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

除了其他方面的問題是,$內容變量包含HTML和東西雙引號例如像id =「測試」不玩好所有這些連接。試圖弄清楚這一點,我感到很茫然。

我已經嘗試將$ content中的引號轉換爲",但導致瀏覽器將div id放在雙引號中(「」test「」)。

** **更新

使用json_encode方法做工作,爲獲取數據到父頁面。這比我一直在做的事情要容易得多(我已經完成了這麼多工作,但認爲有些不對勁)。也就是說,如果div id =「test」中有雙引號,則數據的評估仍然失敗。一串只是「測試」的作品,但它實際上使「測試」逐字。這是使用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時失敗。提示警告,以取代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; ?>); 

我upvoted每個人的答案,因爲我用的一切位。非常感謝!

+0

你可以Base64編碼,它逃脫 - 這是醜陋的,但它會工作。 – jimw 2012-04-14 02:26:24

+0

Ahhhh,PHP字符串混合的日子(不是那麼好)。我只是將整個網站從PHP轉換爲python,無法相信我最終刪除了多少個轉義字符。 – 2012-04-14 02:30:27

回答

3

JSON是你的朋友。

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

如果你唯一的擔心是雙引號,爲什麼不把它們換成一個轉義字符串?

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

我不能完全測試,但這似乎對我工作。

2

你需要使用str_replace

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