web-dev-qa-db-ja.com

jQueryで改行を含むJSON形式のテキストを取得するときの問題

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' with ''は機能せず、適切な解決策に近かった。このコードは問題のある文字を削除しました:

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

}
43

keep改行したい場合は、以下を試してみてください:

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;
}
47
eyelidlessness

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

7
xobofni

PHP4でjson_encode(PHP5で使用可能)をエミュレートするクラスを作成しているときに、この問題に遭遇しました。ここに私が思いついたものがあります:

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

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

3
GabrielP

簡単、試してみてください:

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

私はそれをテストしましたが、完璧に動作します。複雑な機能を追加する必要はありません。

1
alex t

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

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

またはチェックアウト rlencode

1
ThoKra

Terwに似ていますが、\ nを置き換えます

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

すべての改行を削除する必要がありますが、jqueryはフェールオーバーしないでください
タグですが、改行はJSONにしないでください。

1
Pim Jager

これを試しましたか

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

1
r4wi

他の応答が機能しなかった場合、スペースを除くすべての空白文字を取り除くことができます。

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

から: https://github.com/joomla/joomla-cms/issues/14502

1
medskill

すべての改行と空白を保持する<pre>タグを使用することもできます。私はこの問題に遭遇し、解決策のためにこの質問に到達したので、この答えを投稿しています。その後、<pre>の代わりに<div>タグを使用することをランダムに決定しました不要なバックスラッシュ\

0
Ravinder Payal