簡體   English   中英

從PHP生成的javascript對象中轉義引號

[英]Escaping quotes in a javascript object generated from PHP

我覺得這肯定是一個經常回答的問題的副本,但是我找不到解決我特定問題的答案。

我正在通過PHP從MySQL加載數據,包括一些字符串和一個JSON編碼的字符串。 該數據可能包含用戶輸入的特殊字符。

然后,我將這些數據合並到一個PHP數組中,然后對其進行json_encode並使用JSON.parse其讀入javascript。

我的問題是,這些字符串中的任何撇號都會中斷javascript,從而阻止JSON.parse完成。

我認為可以通過三種方法解決此問題:

  1. 在將用戶輸入的數據保存到數據庫之前對其進行某種編碼
  2. 從MySQL加載時轉義特殊字符(使用htmlspecialchars()或類似方法),盡管在加載存儲為JSON字符串的數據時這會很困難(我想我可以對其進行解碼,然后遍歷並轉義每個元素中的特殊字符) ,然后重新編碼)。
  3. 以某種方式轉義javascript中的特殊字符。 但是我不知道該怎么做。

我不得不說特殊字符編碼可能是Web開發中最令人沮喪的方面,因為它導致了很多意外錯誤,並且我難以理解不同的功能以及何時使用它們。

編輯:

var feedback = JSON.parse('{"721103":[{"sessionid":"45","feedback":{"praise":["","",""],"development":["","",""]}},{"sessionid":"46","feedback":{"praise":["Test","Test's",""],"development":["","",""]}}') ;

Test's撇號打破了JavaScript

這樣可以防止您的JavaScript損壞:

var feedback = JSON.parse(`{"721103":[{"sessionid":"45","feedback":{"praise":["","",""],"development":["","",""]}},{"sessionid":"46","feedback":{"praise":["Test","Test's",""],"development":["","",""]}}]}`) ;

它使用``而不是''。 它們的作用相同,但不會互相影響。

我還糾正了您的json語法錯誤。

在存儲在數據庫中之前,請勿清除用戶數據。 取回后,您可以隨意調整它。

我假設您正在使用PHP的json_encode()函數來生成JSON編碼的字符串,在這種情況下,您可以使用JSON_HEX_APOS選項將撇號編碼為\' ,例如:

json_encode( $a, JSON_HEX_APOS )

其中$a是您的PHP數組。 這將產生一個沒有實際撇號的JSON字符串,您可以將其與撇號括起來以創建Javascript字符串:

echo "var feedback = JSON.parse('" . json_encode( $a, JSON_HEX_APOS ) . "')";

我嘗試使用有效的實際解決方案來編輯​​@kmoser的答案的嘗試在同行評審中被拒絕,所以這是可行的。 全部歸功於@kmoser:

$json_feedback = preg_replace( preg_quote('/\\u/\u0026#39;), '\\\\\\\\\\\\\\\\u\u0026#39;, json_encode( $feedback, JSON_HEX_APOS | JSON_HEX_QUOT ) );

當從MySQL數據庫檢索數據時,它通過用十六進制字符串替換單引號和雙引號來工作。 由於我不明白的原因,它仍然破壞了JavaScript,因此我做了一個preg_replace ,在轉義的代碼前加上了一個反斜杠。

請注意,為了說服preg_replace放入其他反斜杠以防止javascript中斷,我必須插入多少個反斜杠。 我也許可以用更少的反斜杠來擺脫,這里出現的數字主要是出於對這個愚蠢問題的無奈之舉!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM