Проблема при получении текста в формате JSON, содержащем разрывы строк с помощью jQuery
У меня возникла странная проблема при получении форматированного текста 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?
Update
В то время как предложения о замене '\n'
на ''
не работали, это было близко к правильному решению. Этот код удалил оскорбительные символы:
function parse($text){
$parsedText = str_replace(chr(10), "", $text);
return str_replace(chr(13), "", $parsedText);
}
Ответы
Ответ 1
Если вы хотите, чтобы сохранить разрыв строки, вы можете попробовать:
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;
}
Ответ 2
Разрывы строк не являются проблемой, так как они должны быть надлежащим образом экранированы в JSON. Если это доступно вам, вы можете использовать json_encode, который автоматически ускользает от строк новой строки. В противном случае вы можете использовать что-то вроде метода Pim Jager выше, хотя лучший JSON-кодер будет лучше.
Ответ 3
Я столкнулся с этой проблемой, создав класс в 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.'"';
}
}
Я следил за правилами, упомянутыми здесь здесь.
Я использовал только то, что мне нужно, но я считаю, что вы можете адаптировать его к вашим потребностям на используемом вами языке. Проблема в моем случае была не о новостях, как я изначально думал, а о том, что/не удалось избежать. Я надеюсь, что это помешает кому-то еще от небольшой головной боли, я выяснил, что я сделал неправильно.
Ответ 4
Получаете ли вы строки, подобные < br/ > или новые строки, такие как \n?
Но попробуйте заменить их на PHP.
<?php
$string = 'asdfasf<br />asdfasf';
echo str_replace('<br />', '', $strin); // Replace <br /> with '' (nothing)
?>
или зайдите urlencode
Ответ 5
Как и Terw, но с заменой \n
<?php
$json = str_replace('\n', '', $json);
?>
Чтобы удалить все разрывы строк, jquery не должен терпеть неудачу над тегами, но разрывы строк не должны находиться в JSON.
Ответ 6
Вы пробовали это
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
Ответ 7
Просто, просто попробуйте:
<?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
Я тестировал его, и он отлично работает. Не нужно добавлять сложные функции.
Ответ 8
Если другие ответы не сработали, можно удалить все пробельные символы, кроме пробела.
PHP
$text = trim(preg_replace( "/[\\x00-\\x19]+/" , '' , $text));
От: https://github.com/joomla/joomla-cms/issues/14502
Ответ 9
Вы также можете использовать тег <pre>
, который будет хранить все разрывы строк и пробелы.
Я отправляю этот ответ, потому что я также сталкиваюсь с этой проблемой и для решений, к которым я обратился к этому вопросу, и после этого я случайно решил использовать тег <pre>
вместо <div>
и решить эту проблему, хотя во многих местах были нежелательные обратные косые черты \