簡體   English   中英

PHP JSON 字符串,轉義 JS 的雙引號 output

[英]PHP JSON String, escape Double Quotes for JS output

我正在從 PHP 數組創建一個 JSON 字符串。 我已經使用json_encode()對其進行了編碼。

$data = array(
    'title' => 'Example string\'s with "special" characters'
);

$data = json_encode( $data );

$data使用wp_localize_script()本地化,並且可以通過全局data變量訪問。

在 JS 文件中,我可以通過以下方式訪問信息:

var data     = data.replace( /"/g, '"' ),
    jsonData = jQuery.parseJSON( data );

console.log( jsonData );

這導致 output 為:

{ "title":"Example string's with "special" characters" }

將該結果輸入http://jsonlint.com/ 會返回錯誤。 刪除 "special" 周圍的雙引號可以驗證字符串。

從 PHP 創建 JSON 字符串並正確轉義以在 JS 文件中使用的最佳方法是什么?

另一種方法是使用htmlspecialchars對引號進行編碼:

$json_array = array(
    'title' => 'Example string\'s with "special" characters'
);

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');

我成功地做到了這一點:

$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT)); 

json_encode()默認將轉義"\\" 但是json.PARSE()仍然是錯誤的 JSON。 因此,通過添加選項JSON_HEX_QUOTjson_encode()將取代""json.PARSE()仍然不會像" 。然后我們需要更換"\\\\" \\\\\\\\\\"被轉義\\\\"

注意:如果您有 javascript 單引號問題,您可以添加選項JSON_HEX_APOS以用 unicode HEX值替換單引號。

例如: json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));

使用json_encode($json_array, JSON_HEX_QUOT); 從 php 5.3 開始: http : //php.net/manual/en/json.constants.php

來自http://www.php.net/manual/zh/function.json-encode.php#100565

就是說,引號“會產生無效的JSON,但這僅是一個問題,如果您使用的是json_encode()並且只希望PHP神奇地轉義您的引號。您需要自己進行轉義。

這是一個處理單引號和雙引號的解決方案:

<?php
$php_data = array("title"=>"Example string's with \"special\" characters");

$escaped_data = json_encode($php_data, JSON_HEX_QUOT | JSON_HEX_APOS);
$escaped_data = str_replace(['\u0022', '\u0027'], ["\\\"", "\\'"], $escaped_data);
?>
<script>
// no need to use JSON.parse()...
var js_data = <?= $escaped_data ?>;
alert(js_data.title); // should alert `Example string's with "special" characters`
</script>

我剛剛遇到了這個問題,實際問題是我在吐出實際的 JSON 數據之前忘記添加一個正確的 application/json 標頭。

header('Content-Type: application/json');

我遇到了一些用戶無辜地輸入 € 和一些使用雙引號來定義他們的內容的挑戰。 我調整了這個頁面和其他人的幾個答案,最終定義了我的小解決方法

$products = array($ofDirtyArray);
if($products !=null) {
    header("Content-type: application/json");
    header('Content-Type: charset=utf-8');
    array_walk_recursive($products, function(&$val) {
        $val = html_entity_decode(htmlentities($val, ENT_QUOTES, "UTF-8"));
    });
    echo json_encode($products,  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
}

我希望它可以幫助某人/某人改進它。

不在 HTML 標簽中的腳本出現錯誤。

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<pre><?php print_r($_POST??'') ?></pre>

<form method="POST">
    <input type="text" name="name"><br>
    <input type="email" name="email"><br>
    <input type="time" name="time"><br>
    <input type="date" name="date"><br>
    <input type="hidden" name="id"><br>
    <textarea name="detail"></textarea>
    <input type="submit" value="Submit"><br>
</form>
<?php 
/* data */
$data = [
            'name'=>'loKESH"'."'\\\\",
            'email'=>'imvsrajput@demo.demo',
            'time'=>date('H:i:00'),
            'date'=>date('Y-m-d'),
            'detail'=>'Try this var_dump(0=="ZERO") \\ \\"'." ' \\\\    ",
            'id'=>123,
        ];
?>
<span style="display: none;" class="ajax-data"><?=json_encode($_POST??$data)?></span>
<script type="text/javascript">
    /* Error */
    // var json = JSON.parse('<?=json_encode($data)?>');
    /* Error solved */
    var json = JSON.parse($('.ajax-data').html());
    console.log(json)
    /* automatically assigned value by name attr */
    for(x in json){
        $('[name="'+x+'"]').val(json[x]);
    }
</script>

有點老了,但我使用以下方法為我解決了這個問題:

$data = json_encode($data, JSON_UNESCAPED_UNICODE);

暫無
暫無

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

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