Проблема при извлечении текста в формате JSON, содержащего разрывы строк, с помощью jQuery - PullRequest
43 голосов
/ 27 декабря 2008

У меня странная проблема при получении текста в формате 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);

}

Ответы [ 9 ]

46 голосов
/ 28 декабря 2008

Если вы хотите сохранить разрывы строк, вы можете попробовать:

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;
}
7 голосов
/ 28 декабря 2008

Разрывы строк не являются проблемой, так как их нужно правильно экранировать в JSON. Если он вам доступен, вы можете использовать json_encode , который автоматически экранирует символы новой строки. В противном случае вы можете использовать что-то вроде описанного выше метода Pim Jager, хотя лучше всего подойдет правильный кодер JSON.

3 голосов
/ 27 мая 2011

Я столкнулся с этой проблемой при создании класса в 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.'"';
    }
}

Я следовал упомянутым правилам здесь . Я использовал только то, что мне было нужно, но я думаю, что вы можете адаптировать его к вашим потребностям на языке, который вы используете. Проблема в моем случае была не в новых строках, как я изначально думал, а в том, что / не удалось избежать. Я надеюсь, что это предотвратит кого-то еще от маленькой головной боли, которая у меня возникла, чтобы понять, что я сделал неправильно.

1 голос
/ 05 сентября 2017

Если другие ответы не сработали, можно удалить все пробельные символы, кроме пробела.

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

От: https://github.com/joomla/joomla-cms/issues/14502

1 голос
/ 12 декабря 2015

Легко, просто попробуйте:

<?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 голос
/ 23 августа 2012

Вы пробовали это

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 голос
/ 27 декабря 2008

Как и Terw, но с заменой \ n

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

Следует удалить все разрывы строк, jquery не должен переносить теги
, но разрывы строк не должны быть в JSON.

1 голос
/ 27 декабря 2008

вы получаете разрывы строк, например,
или переводы строк, например, \ n? Но попробуйте заменить их на PHP.

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

или проверьте urlencode

0 голосов
/ 16 октября 2015

Вы также можете использовать тег <pre>, который сохранит все разрывы строк и пробелы. Я отправляю этот ответ, потому что я также столкнулся с этой проблемой и для решения я достиг этого вопроса, и после этого я случайно решил использовать тег <pre> вместо <div>, и это решено проблемой, хотя во многих местах были нежелательные косые черты \

...