2010-07-13 51 views
7

假設您有一個名爲$ description的PHP變量,其值爲以下值(包含引號和換行符):編碼帶引號和換行符的PHP變量以傳遞給Javascript函數(然後反轉編碼)

Tromp L'oeil Sheath Dress 

You will certainly "trick the eye" of many in this gorgeous illusion. Add it to your fall wardrobe before it disappears. 

您想將此變量的內容傳遞給一個將該值寫入文本類型的INPUT的Javascript函數。

你會如何做到這一點?我試過這個:

$description = htmlspecialchars ($product->description, ENT_QUOTES); 

但是,我得到一個JS錯誤。我也試過這樣:

$description = rawurlencode ($product->description); 

該編碼值,像這樣:

Michael%20Kors%0A%0ATromp%20L%27oeil%20Sheath%20Dress%0A%0AYou%20will%20certainly%20%22trick%20the%20ey%22%20of%20many%20in%20this%20gorgeous%20illusion.%20Add%20it%20to%20your%20fall%20wardrobe%20before%20it%20disappears.%0A%0AAvailable%20in%20Black%2FNude 

這個值可以作爲一個JS變量傳遞,但我不知道一個JS的功能,將乾淨的逆轉一個PHP rawurlencode。

是否有一對匹配的函數可用於在PHP中對一個變量進行編碼,以便將其傳遞給JS函數 - 然後在JS中反轉編碼,以便獲取PHP的原始值變量?

編輯:爲了澄清問題並回複評論,這裏是一些測試代碼:

<?php 
$str =<<<EOT 
Tromp L'oeil Sheath Dress 

You will certainly "trick the eye" of many in this gorgeous illusion. Add it to your fall wardrobe before it disappears. 
EOT; 
echo 'here is the string: <pre>' . $str . '</pre>'; 
?> 

<script type="text/javascript"> 
<?php 
// this does not work with JS as i get an unterminated string literal if i just use addslashes in the following commented-out line 
// echo 'alert(\'' . addslashes($str) . '\');'; 

// this works with JS (the alert activates) but how do i un-rawurlencode in JS? 
// echo 'alert(\'' . rawurlencode($str) . '\');'; 

// this does not work with JS, because of the line breaks 
echo 'alert(\'' . htmlspecialchars ($str, ENT_QUOTES) . '\');'; 
?> 
</script> 
+0

爲什麼不直接呼應的實際變量轉化爲JavaScript變量?所有你需要擔心的是單引號和/或雙引號,可以通過'addslashes()'方便地修復... – animuson 2010-07-13 18:10:36

+0

你從PHP獲取這個到js的方法是什麼?它只是迴應到腳本標記分配js變量和執行後輸出html中的某個地方? – DeaconDesperado 2010-07-13 18:10:56

+0

你可以對什麼是「不工作」與用htmlspecialchars更具體? – Savageman 2010-07-13 18:11:02

回答

2

我遇到的問題在這裏使用一些答案的建議,其中包括換行符問題,像/解碼某些HTML entitites。我結束了使用rawurlencode(在PHP)和decodeURIComponent(在Javascript)作爲匹配功能編碼/因此它可以作爲一個JS變量傳遞解碼的字符串。這是其他任何人遇到這個問題的工作代碼。

<?php 
$str =<<<EOT 
Tromp L'oeil Sheath Dress 

You will certainly "trick the eye" of many in this gorgeous illusion. Add it to your fall wardrobe before it disappears. 
Available in Black/Nude 
EOT; 
echo 'here is the string: <pre>' . $str . '</pre>'; 
?> 
<p>below is the variable doc.write'd after being rawurlencod'ed in PHP then decodeURIComponent'ed in JS:</p> 
<script type="text/javascript"> 
<?php 
echo 'document.write(decodeURIComponent("'. rawurlencode($str).'"));'; 
?> 
1

您可以使用安裝json_encode。它根據作爲JavaScript子集的JSON data format對字符串進行編碼;所以任何JSON也是有效的JavaScript。

<script type="text/javascript"> 
<?php 
    echo 'alert('. json_encode($str).');'; 
?> 
</script> 

否則嘗試PHP’s rawurlencode,並將其與JavaScript’s decodeURI解碼:

<script type="text/javascript"> 
<?php 
    echo 'alert(decodeURI("'. rawurlencode($str).'"));'; 
?> 
</script> 
+0

謝謝,只是爲了跟進,decodeURI幾乎可以工作,但不會解碼像/這樣的特定字符,所以我使用decodeURIComponent去了,就像你在我的答案中看到的那樣... – bobbyh 2010-07-14 19:31:33

0

JSON是解決方案。 見示例代碼 兩頁展示

首頁json.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Untitled Document</title> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
</head> 

<body> 


<script type="text/javascript"> 
    $(document).ready(function() { 
    // This is more like it! 
    $('#submit').live('click', function() { 
     var id=$("#id").attr("value"); 
     $.getJSON("json-call.php", {id:id}, function callback(data) { 
      $("#list").html("var1:"+data['var1']+"<br/>"+"var2:"+data['var2']+"<br />id:"+data['id']); 
     }); 
    }); 

    }); 
</script> 

<input id="id" type="text" value="test value" /> 
<input type="button" id="submit" value="submit" /> 

<div id="list"></div> 


</body> 
</html> 

第二頁JSON-call.php

$var1 = 'your name'; 
$var2 = 'your address'; 
$id = $_REQUEST['id']; 
print(json_encode(array ('var1' => $var1, 'var2' => $var2, 'id'=>$id))); 

與結果

var1:your name 
var2:your address 
id:test value 
0

不知道無論json_decode是否處理您需要的一切。 htmlspecialchars()和htmlspecialchars_decode()應該對除了換行符之外的所有內容都有效。換行符是一種痛苦,因爲換行符和回車的組合將取決於瀏覽器,但我覺得這樣的事情應該工作:

$value = "your string with quotes and newlines in it."; 

//take cares of quotes 
$js_value = htmlspecialchars($value);  
//first line replaces an ASCII newline with a JavaScript newline 
$js_value = str_replace("\n",'\n',$js_value); 
//second line replaces an ASCII carriage return with nothing, so you don't get duplicates 
$js_value = str_replace("\r",'',$js_value); 

//reverse to convert it back to PHP 
$php_value = str_replace('\n',"\r\n",$js_value); 
$php_value = htmlspecialchars_decode($php_value); 

也許不是最優雅的解決方案,但是這不是真的我的專長。;)另外,請記住,換行符只會落得像在<輸入型=「文本」 >場空間。

0

這裏是痘痘的東西我已經做:

function safefor_js($str) { 
    return str_replace(array("'",'"',"\n"), array('\x22','\x27','\\n'), $str); 
} 
+0

那反斜槓字符呢? – Gumbo 2010-07-13 20:56:42

+0

我沒有想到的,但我不認爲這是必要的。我只是用「a \ na」,「a \ x22a」,「a \ xn \ x22a」,「a \ x27a」(全部用引號)來測試它,並且它沒有以任何方式打破頁面。有什麼我失蹤?如果我錯了,我肯定會想修復它。 – Echo 2010-07-13 21:08:28

相關問題