Сообщение JSON с волшебными кавычками плюс символ кавычки в данных

У меня есть PHP-скрипт, который принимает сообщения с других серверов в формате JSON. Иногда на внешнем сервере включены волшебные кавычки, поэтому я пропускаю их через stripslashes() на всякий случай. Однако я сталкиваюсь с проблемами, когда публикуемые данные также имеют символ кавычек. Это также ускользает от удаленного сервера, а затем стрипы на моем сервере также неправильно удаляют это, нарушая JSON.

Например, я могу легко передать и принять следующий JSON:

stuff = {"items":["item1","item2"],
"urls":["url1","url2"],
"pics":["pic1","pic2"]};

Однако это сломается:

stuff = {"items":["item_including_quotes1","item_including_quotes2"],
"urls":["url1","url2"],
"pics":["pic1","pic2"]};

У меня нет контроля над значениями удаленного массива, и они могут содержать одинарные и двойные кавычки. У меня есть контроль над тем, как они подготавливаются к отправке. В настоящее время javascript выглядит так:

encodeURIComponent(JSON.stringify(stuff));

и PHP выглядит так:

json_decode(stripslashes(urldecode($_POST["stuff"])));

Эти данные публикуются с помощью javascript JSON.stringify и encodeuricompnent и обрабатываются с помощью PHP json_decode и urldecode.

Я рассматривал регулярное выражение для удаления обратной косой черты только тогда, когда они появляются между скобками [], но это кажется неуклюжим. Есть ли более элегантное решение для удаления только определенных косых черт?


person Ammon B    schedule 07.02.2013    source источник
comment
Я работал над этим, отправляя элементы объекта в функцию, которая заменяет кавычки на «перед вызовом stringify, а затем декодирует html-объекты в php-скрипте. Было бы интересно узнать, есть ли у кого-нибудь более элегантное решение.   -  person Ammon B    schedule 08.02.2013


Ответы (1)


Я передавал HTML-код внутри строкового значения в структуре JSON и столкнулся с той же проблемой. Однако мне не пришлось заменять кавычки, так как JSON.stringify дает мне правильно сформированную строку.

Что я сделал, так это реализовал модифицированную функцию из указанной здесь: http://www.php.net/manual/en/security.magicquotes.disabling.php

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>

Таким образом, он просто применяет косую черту, когда включены волшебные кавычки, и пока это, кажется, не нарушает мой JSON.

person Daniel Cantarin    schedule 21.04.2013