44

JSON 形式のテキストを取得するときに奇妙な問題が発生します。jQueryを使用postして、一部のデータ(JSON形式も)をサーバー(PHPを実行)に送信します。これは正常に機能します。次に、 jQuery を使用してサーバーから同じデータを要求するとget、コールバック メソッドは実行されません。これは、データが JSON 形式で、データに改行が含まれている場合にのみ発生します。JSON フォーマットを使用しない場合、問題なく動作します。困惑するのは、データのアップロードに問題がないことです。

コードのアップロード: (動作)

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

ダウンロード コード: (改行では機能しません)

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

全体の問題は、オプションを有効にしたにもかかわらず、TinyMCE リッチ テキスト エディターがどこにでも改行を挿入することを主張しているように見えるという事実に起因しています。

remove_linebreaks : true

私は改行を入れたいと思っていますが、コードが壊れる場合はそうではありません。ここで何が問題なのか、おそらくPHPを使用してサーバー上の改行をエンコードする方法を教えてもらえますか?


アップデート

置き換える提案は機能'\n'''ませんでしたが、正しい解決策に近かったです。このコードは、問題のある文字を削除しました。

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

}
4

9 に答える 9

47

改行を維持したい場合は、次のことを試してください。

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;
}
于 2008-12-28T00:45:03.733 に答える
7

改行は、JSON で適切にエスケープする必要があるため、それほど問題ではありません。利用可能な場合は、改行を自動的にエスケープするjson_encodeを使用できます。それができない場合は、上記の Pi​​m Jager の方法のようなものを使用できますが、適切な JSON エンコーダーが最適です。

于 2008-12-27T21:03:25.787 に答える
3

json_encode (PHP5 で利用可能) をエミュレートするために PHP4 でクラスを作成しているときに、その問題が発生しました。これが私が思いついたものです:

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

ここに記載されているルールに従いました。必要なものだけを使用しましたが、使用している言語でニーズに合わせて調整できると思います。私の場合の問題は、当初考えていた改行ではなく、 / がエスケープされていないことでした。これが、私が何を間違えたのかを理解するために私が抱えていた小さな頭痛から誰かを防ぐことを願っています.

于 2011-05-27T18:08:11.090 に答える
1

これを試しましたか

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

それは私のために働いたmysql 5.0.45

于 2012-08-22T21:22:00.310 に答える
1

<br /> のような改行や \n のような改行はありますか? しかし、それらを PHP に置き換えてみてください。

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

またはurlencodeをチェックしてください

于 2008-12-27T20:40:31.030 に答える
1

Terw と同様ですが、\n を置き換えます

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

すべての改行を削除する必要があります。jquery は
タグをフェールオーバーすべきではありませんが、JSON に改行を含めることはできません。

于 2008-12-27T20:50:14.940 に答える