2012-04-14 8 views
3

Ich habe eine Seite iframed innerhalb eines anderen. Die untergeordnete Seite kommuniziert mit der übergeordneten Seite mithilfe der Funktion sendMessage(). Die übergeordnete Seite führt eval() für die Nachricht aus, die von der untergeordneten Seite empfangen wird.Wie PHP und JavaScript Zeichenfolgen mit Anführungszeichen zu verketten, um richtig zu bewerten

Dies ist der Code, der die Nachricht konstruiert:

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

Das Problem ist unter anderem, dass der $ content Variable enthält HTML und die doppelten Anführungszeichen in Dinge wie id = „test“ nicht gut spielen mit all diese Verkettung. Ich bin nicht in der Lage, das herauszufinden.

Ich habe bereits versucht, die Zitate in $ content durch Umwandlung in " zu entkommen, aber das führte dazu, dass der Browser Div-IDs in doppelte Anführungszeichen ("" test "") legte.

** Update **

die json_encode Methode verwenden funktioniert für die Daten an die übergeordnete Seite zu bekommen. Es ist eine viel einfachere Lösung als das, was ich getan habe (ich hatte schon so viel erreicht, aber ich dachte mir, dass etwas nicht stimmt). Das heißt, das Eval der Daten schlägt immer noch fehl, wenn in einer div id = "test" doppelte Anführungszeichen stehen. Eine Reihe von nur "Test" funktioniert, aber es setzt "Test" wörtlich. Dies ist die Javascript-Quelle in der HTML nach der Verwendung der JSON-Methode:

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); 

Dies schlägt bei der Eval. Das Setzen einer Warnung anstelle des Evals ergibt folgendes:

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

Irgendwelche Ideen?

** Update 2 **

Also habe ich diese endlich herausgefunden. Es war eine Kombination der drei Antworten unten. Die Antwort von json gab mir einen Tipp. Grundsätzlich mussten die doppelten Anführungszeichen dreifach rückgestrichen werden, so dass zum Zeitpunkt des Tests alles richtig gelesen werden würde.

Ich lief ein paar andere Haken, einschließlich/r/n Zeichen in der HTML ... die ich mit str_replace und auch ein Apostroph entfernt ... das war in einem inneren HTML-Element ... Ich ersetzte das mit die entsprechende HTML-Entität und BAM! Hier

ist der Code:

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; ?>); 

ich jede Antwort upvoted da ich Bits alles. Ich danke dir sehr!

+0

mit Sie base64 es kodieren könnte - es ist hässlich, aber es würde funktionieren. – jimw

+0

Ahhhh, die (nicht so) guten alten Tage der PHP-String-Mischung. Ich habe gerade eine ganze Seite von PHP in Python umgewandelt und konnte nicht glauben, wie viele Escape-Zeichen ich entfernte. –

Antwort

3

JSON ist dein Freund.

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

Wenn Sie nur doppelte Anführungszeichen verwenden, ersetzen Sie sie einfach durch eine Escapezeichenfolge?

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

Ich kann nicht genau Test, aber das scheint mir zu arbeiten.

2

Sie müssen entkommen str_replace

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