it-swarm.com.de

Problem beim Abrufen von Text im JSON-Format, der Zeilenumbrüche mit jQuery enthält

Ich habe ein seltsames Problem beim Abrufen von JSON-formatiertem Text. Ich verwende jQuery post, um einige Daten (auch JSON-formatiert) an den Server zu senden (PHP läuft), was gut funktioniert. Wenn ich dann dieselben Daten mit jQuery get vom Server abrufe, wird die Callback-Methode nie ausgeführt. Dies tritt nur auf, wenn die Daten JSON-formatiert sind und die Daten einen Zeilenumbruch enthalten. Wenn ich keine JSON-Formatierung verwende, funktioniert es einwandfrei. Was mich verblüfft, ist, dass es beim Hochladen der Daten keine Probleme gibt.

Code hochladen: (funktioniert)

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

Code herunterladen: (funktioniert nicht mit Zeilenumbrüchen)

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

Das ganze Problem rührt von der Tatsache her, dass der TinyMCE-Rich-Text-Editor scheinbar darauf besteht, überall Zeilenumbrüche einzufügen, obwohl ich die Option aktiviert habe

remove_linebreaks : true

Ich bevorzuge Zeilenumbrüche, aber nicht, wenn sie meinen Code beschädigen. Kann mir jemand sagen, wo das Problem liegt und wie ich die Zeilenumbrüche auf dem Server mit PHP verschlüsseln kann?


Aktualisieren

Die Vorschläge, '\n' durch '' zu ersetzen, funktionierten zwar nicht, waren jedoch nahe an der richtigen Lösung. Dieser Code hat die beleidigenden Zeichen entfernt:

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

}
43

Wenn Sie behalten die Zeilenumbrüche möchten, können Sie Folgendes versuchen:

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

Zeilenumbrüche sind nicht so sehr das Problem, als dass sie in JSON ordnungsgemäß maskiert werden müssen. Wenn es für Sie verfügbar ist, können Sie json_encode verwenden, um Zeilenumbrüche automatisch zu umgehen. Andernfalls können Sie die oben beschriebene Methode von Pim Jager verwenden, obwohl ein geeigneter JSON-Encoder am besten ist.

7
xobofni

Dieses Problem ist mir beim Erstellen einer Klasse in PHP4 zur Emulation von json_encode (in PHP5 verfügbar) aufgetreten. Folgendes habe ich mir ausgedacht:

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.'"';
    }
}

Ich habe die Regeln hier ..__ befolgt. Ich habe nur das verwendet, was ich brauchte, aber ich kann mir vorstellen, dass Sie es an Ihre Bedürfnisse in der von Ihnen verwendeten Sprache anpassen können. Das Problem in meinem Fall betraf nicht die Zeilenumbrüche, wie ich ursprünglich dachte, sondern die Tatsache, dass der/die nicht entkommen ist. Ich hoffe, dass jemand anderen die kleinen Kopfschmerzen erspart, die ich herausgefunden habe, was ich falsch gemacht habe.

4
GabrielP

Einfach, probiere es einfach aus:

<?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

Ich habe es getestet und es funktioniert perfekt. Es müssen keine komplizierten Funktionen hinzugefügt werden.

1
alex t

erhalten Sie Zeilenumbrüche wie <br /> oder Zeilenumbrüche wie\n? Versuchen Sie jedoch, sie durch PHP zu ersetzen.

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

oder auschecken urlencode

1
ThoKra

Wie Terw, aber mit\n ersetzen

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

Sollten alle Zeilenumbrüche entfernt werden, sollte jquery nicht fehlschlagen 
Tags, aber Zeilenumbrüche sollten nicht in JSON sein.

1
Pim Jager

Hast du das probiert?

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

Es hat für mich auf mysql 5.0.45 funktioniert

1
r4wi

Wenn die anderen Antworten nicht funktionierten, können Sie alle Leerzeichen außer dem Leerzeichen entfernen.

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

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

1
medskill

Sie können auch <pre>-Tag verwenden, das alle Zeilenumbrüche und Leerzeichen beibehalten soll ..__ Ich poste diese Antwort, weil ich auch auf dieses Problem stoße und für Lösungen habe ich diese Frage erreicht. Danach entschied ich mich zufällig, <pre>-Tag anstelle von zu verwenden <div> und das Problem wurde gelöst, obwohl an vielen Stellen unerwünschte Schrägstriche auftraten \

0
Ravinder Payal