44 votes

Problème lors de la récupération de texte au format JSON contenant des sauts de ligne avec jQuery

J'ai un problème étrange lors de la récupération de texte formaté en JSON. J'utilise jQuery post pour envoyer des données (également formatées en JSON) au serveur (qui exécute PHP), ce qui fonctionne bien. Ensuite, lorsque je demande les mêmes données au serveur en utilisant jQuery get la méthode de rappel ne s'exécute jamais. Cela ne se produit que lorsque les données sont formatées en JSON et qu'elles contiennent un saut de ligne. Lorsque je n'utilise pas le formatage JSON, tout fonctionne bien. Ce qui m'étonne, c'est que le téléchargement des données ne pose aucun problème.

Téléchargement du code : (fonctionne)

$.post("ajax/contents_ajax.php", {
    'title': caption,
    'text': frameText().getContent(),
    'image_id': img
},
//Callback

Télécharger le code : (ne fonctionne pas avec les sauts de ligne)

$.get("ajax/contents_ajax.php", { 'get_item': id },
function (data){
    //Never gets executed if data contains line breaks
}
,'json');

Tout le problème vient du fait que l'éditeur de texte riche TinyMCE semble insister pour insérer des sauts de ligne partout, même si j'ai activé l'option

remove_linebreaks : true

Je préfère avoir des sauts de ligne, mais pas s'ils cassent mon code. Quelqu'un peut-il me dire quel est le problème ici, et peut-être comment je peux coder les sauts de ligne sur le serveur avec PHP ?


Mise à jour

Alors que les suggestions de remplacement '\n' avec '' n'a pas fonctionné, il était proche de la bonne solution. Ce code a supprimé les caractères incriminés :

function parse($text){
    $parsedText = str_replace(chr(10), "", $text);
    return str_replace(chr(13), "", $parsedText);

}

47voto

eyelidlessness Points 28034

Si vous souhaitez garder les sauts de ligne, vous pouvez essayer :

function parse($text) {
    // Damn pesky carriage returns...
    $text = str_replace("\r\n", "\n", $text);
    $text = str_replace("\r", "\n", $text);

    // JSON requires new line characters be escaped
    $text = str_replace("\n", "\\n", $text);
    return $text;
}

7voto

xobofni Points 71

Les sauts de ligne ne sont pas le problème, mais ils doivent être correctement échappés dans le JSON. Si vous en avez la possibilité, vous pouvez utiliser l'option json_encode qui échappe automatiquement les nouvelles lignes. Sinon, vous pouvez utiliser quelque chose comme la méthode de Pim Jager ci-dessus, bien qu'un encodeur JSON approprié soit préférable.

3voto

GabrielP Points 41

J'ai rencontré ce problème en créant une classe en PHP4 pour émuler json_encode (disponible en PHP5). Voici ce que j'ai trouvé :

class jsonResponse {
    var $response;

    function jsonResponse() {
        $this->response = array('isOK'=>'KO','msg'=>'Undefined');
    }

    function set($isOK, $msg) {
        $this->response['isOK'] = ($isOK) ? 'OK' : 'KO';
        $this->response['msg'] = htmlentities($msg);
    }

    function setData($data=null) {
        if(!is_null($data))
            $this->response['data'] = $data;
        elseif(isset($this->response['data']))
            unset($this->response['data']);
    }

    function send() {
        header('Content-type: application/json');
        echo '{"isOK":"'.$this->response['isOK'].'","msg":'.$this->parseString($this->response['msg']);
        if(isset($this->response['data']))
            echo ',"data":'.$this->parseData($this->response['data']);
        echo '}';
    }

    function parseData($data) {
        if(is_array($data)) {
            $parsed = array();
            foreach ($data as $key=>$value)
                array_push($parsed, $this->parseString($key).':'.$this->parseData($value));
            return '{'.implode(',', $parsed).'}';
        } else
            return $this->parseString($data);
    }

    function parseString($string) {
            $string = str_replace("\\", "\\\\", $string);
            $string = str_replace('/', "\\/", $string);
            $string = str_replace('"', "\\".'"', $string);
            $string = str_replace("\b", "\\b", $string);
            $string = str_replace("\t", "\\t", $string);
            $string = str_replace("\n", "\\n", $string);
            $string = str_replace("\f", "\\f", $string);
            $string = str_replace("\r", "\\r", $string);
            $string = str_replace("\u", "\\u", $string);
            return '"'.$string.'"';
    }
}

J'ai suivi les règles mentionnées ici . Je n'ai utilisé que ce dont j'avais besoin mais je pense que vous pouvez l'adapter à vos besoins dans la langue que vous utilisez. Dans mon cas, le problème ne concernait pas les nouvelles lignes comme je le pensais à l'origine, mais le / qui n'était pas échappé. J'espère que cela évitera à quelqu'un d'autre le petit mal de tête que j'ai eu en cherchant ce que j'avais fait de mal.

1voto

ThoKra Points 1706

Vous obtenez des sauts de ligne comme <br /> ou des retours à la ligne comme \n ? Mais essayez de les remplacer par PHP.

<?php
$string = 'asdfasf<br />asdfasf';
echo str_replace('<br />', '', $strin); // Replace <br /> with '' (nothing)
?>

ou consultez urlencode

0 votes

Je ne suis pas sûr, exactement. Il apparaît simplement comme une nouvelle ligne dans phpMyAdmin lorsque je parcours l'entrée de la base de données qui stocke le texte, il n'y a donc pas de représentation spécifique des caractères que je peux voir.

1voto

Pim Jager Points 20018

Comme Terw mais en le remplaçant \n

<?php
 $json = str_replace('\n', '', $json);
?>

Il faut supprimer tous les sauts de ligne, jquery ne doit pas tomber en panne.
mais les sauts de ligne ne doivent pas figurer dans le JSON.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X