web-dev-qa-db-fra.com

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

Je rencontre un problème étrange lors de la récupération de texte au format JSON. J'utilise jQuery post pour envoyer des données (également au format JSON) au serveur (avec PHP), ce qui fonctionne bien. Ensuite, lorsque je demande les mêmes données au serveur à l'aide de jQuery get, la méthode de rappel ne s'exécute jamais. Cela se produit uniquement lorsque les données sont au format JSON et que les données contiennent un saut de ligne. Lorsque je n'utilise pas le format JSON, cela fonctionne bien. Ce qui me dérange, c’est qu’il n’ya aucun problème avec le téléchargement des données.

Code de téléchargement: (fonctionne)

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

Code de téléchargement: (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 provient du fait que l'éditeur de texte enrichi de 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 et comment peut-on encoder les sauts de ligne sur le serveur avec PHP?


Mettre à jour

Les suggestions de remplacement de '\n' par '' ne fonctionnaient pas, mais c’était presque 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);

}
43
Morten Christiansen

Si vous souhaitez conservez 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;
}
46
eyelidlessness

Les sauts de ligne ne sont pas le problème car ils doivent être correctement évités dans JSON. Si cela est disponible, vous pouvez utiliser json_encode qui échappe automatiquement aux retours à la ligne. À défaut, vous pouvez utiliser quelque chose comme la méthode de Pim Jager ci-dessus, bien qu'un encodeur JSON approprié soit préférable.

7
xobofni

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

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 j’imagine que vous pouvez l’adapter à vos besoins dans la langue que vous utilisez. Le problème dans mon cas ne concernait pas les nouvelles lignes comme je le pensais à l’origine, mais la J'espère que cela évitera à quelqu'un d'autre le petit mal de tête que j'avais à comprendre ce que j'avais mal fait.

4
GabrielP

Facile, essayez juste:

<?php
...
function parseline($string){
  $string = str_replace(chr(10), "//n", $string);
  $string = str_replace(chr(13), "//n", $string);
  return $string;
}

echo parseline($string_with_line_breaks);//returns json readable text

Je l'ai testé et cela fonctionne parfaitement. Pas besoin d'ajouter des fonctions compliquées.

1
alex t

obtenez-vous 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

1
ThoKra

Comme Terw mais en remplaçant\n

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

Si tous les sauts de ligne sont supprimés, jquery ne doit pas basculer 
balises, mais les sauts de ligne ne doivent pas être en JSON.

1
Pim Jager

Avez-vous essayé cela

update tablename set field_name_with_\r\n_in_it = replace(field_name_with_\r\n_in_it,"\r\n","<br />")

Cela a fonctionné pour moi sur mysql 5.0.45

1
r4wi

Si les autres réponses ne fonctionnent pas, il est possible de supprimer tous les caractères d'espacement, à l'exception de l'espace.

PHP $text = trim(preg_replace( "/[\\x00-\\x19]+/" , '' , $text));

De: https://github.com/joomla/joomla-cms/issues/14502

1
medskill

Vous pouvez également utiliser la balise <pre> qui conservera tous les sauts de ligne et les espaces blancs ..__ Je publie cette réponse car je rencontre également ce problème et, pour les solutions que j’ai atteint à cette question, j’ai choisi au hasard d’utiliser la balise <pre><div> et que le problème soit résolu, même si à plusieurs endroits il y avait des barres obliques non désirées \

0
Ravinder Payal