2012-07-07 150 views
0

我動態地創建一個調用JavaScript函數的錨點。它適用於一個字符串參數,但不適用於兩個。我相信我不是正確地繞過參數引號。爲了尋找一個答案我遇到以下我需要幫助轉義字符串參數爲使用PHP的JavaScript函數

onclick="alert('<?echo $row['username']?>')" 

和下一個我發現離開我徹底難倒了

echo('<button type="button" id="button'.$ctr.'"onClick="showMapsInfo(\''.str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr).'\');"><img src="img/maps_logo.gif"></button><br/>'); 

如果有人會請

  1. 解釋爲什麼單引號來了用戶名附近不必轉義?

  2. 哪裏有一個「傻瓜」寫在逃脫字符,所以我可以嘗試破譯第二個例子。

+0

,而不是'str_replace',使用'addslashes'這裏提供一個空格:''「onClick' – hjpotter92 2012-07-07 06:15:31

回答

1

讓我們來就是檢查你的第一個例子

onclick="alert('<?echo $row['username']?>')" 

的重要組成部分,在這裏,是的<? … ?>外一切純粹的HTML,並且從來沒有被PHP解釋器看過。因此,唯一與PHP相關的部分是<? … ?>中的代碼,即echo $row['username']。在這裏,一個人不需要做任何轉義。

你的第二個例子,相比之下

echo('<button type="button" id="button'.$ctr.'"onClick="showMapsInfo(\''.str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr).'\');"><img src="img/maps_logo.gif"></button><br/>'); 

在PHP中,周圍沒有HTML純粹寫的。因此,你必須小心引號。讓我們從頭開始構建,看看這裏會發生什麼。當你建立這樣的事情,你可能會與

echo('<button type="button" id="button1" onClick="showMapsInfo(\'...\');"><img src="img/maps_logo.gif"></button><br/>'); 

啓動,因爲單引號已經作爲字符串分隔符,它們必須\'裏面的字符串進行轉義。現在爲JavaScript函數內的部分。把就更簡單了,上面的代碼歸結爲

echo('showMapsInfo(\'...\');'); 

,當我們要插入一些動態部位,而不是「...」的一部分,這導致在

showMapsInfo('...'); 

,我們需要結束字符串與'並將其連接在一起與.。假設你想插入有一個變量$foobar,那麼你可以這樣寫:

echo('showMapsInfo(\''.$foobar.'\');'); 

導致

showMapsInfo('<VALUE OF $foobar>'); 

您的例子不插入$foobar這個字符串,而是下面的表達式:

str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr) 

其中使用str_replace爲了再次逃避的內容,但有一點扭曲:它不逃脫對於PHP,但對於最終的Javascript!每個單引號'在輸出中成爲一個轉義的單引號\',但您需要編寫\\',因爲反斜槓需要自行轉義,以產生反斜槓作爲輸出。

+0

謝謝你這麼詳細的回覆,這對你有很大的幫助 – 2012-07-07 06:40:16

+0

不客氣! – 2012-07-07 07:04:49

0

您可以使用json_encode函數作爲javascript變量。

echo sprintf(
    '<button type="button" id="button%s" onClick="showMapsInfo(%s, %s);"> 
    <img src="img/maps_logo.gif"></button><br/>', 
    htmlspecialchars($ctr), json_encode($maps_name), json_encode($ctr)); 
+0

感謝您的回答,但現在JSON將不得不等待,我仍然用PHP掙扎,JavaScript中, CSS和HTML5 – 2012-07-07 06:46:05

0
  1. 名左右的單引號不必轉義,因爲它是PHP變量,而不是JavaScript的一部分。

  2. 有關將PHP變量注入JavaScript的信息可以找到here和更多信息here

    如果變量是字符串,則只需將引號括起來。

+1

謝謝你的幫助,我會跟着鏈接。 – 2012-07-07 06:41:15

0

我想你沒有逃脫單引號,當你

只用一個參數調用它的功能正在工作的問題。

檢查您是否正在創建正確的整個參數,如果逗號正確添加,並在javascript中,如果單引號出現bot參數。

最後的參數字符串應該像

「參數1」,「參數2」

+0

謝謝你,我會檢查出來的 – 2012-07-07 06:48:53

1

您可以替換引號,然後使用heredoc,它更清晰易懂。

$maps_name = str_replace("'", "\\'", $maps_name); 
$ctr  = str_replace("'", "\\'", $ctr); 

echo <<<HTML 

<button type="button" id="button$ctr" onClick="showMapsInfo('$maps_name', '$ctr');"><img src="img/maps_logo.gif"></button><br/> 

HTML; 
+1

編輯修復php.net鏈接到英文版本,這當然更具可讀性,但仍然需要轉義php內部的''',否則JS將會拋出語法錯誤 – 2012-07-07 06:33:35

+0

@FabrícioMatté,謝謝,我忘記了更新鏈接。抗體out''',他可以在echo heredoc之前調用'str_replace()',我已經更新了。 – 2012-07-07 06:40:50

+0

謝謝我會試試看。 – 2012-07-07 06:48:04