检索包含jQuery换行符的JSON格式的文本时出现问题

检索JSON格式的文本时遇到一个奇怪的问题。 我使用jQuery post发送一些数据(也是JSON格式)到服务器(运行PHP),它工作正常。 然后,当我使用jQuery get从服务器请求相同的数据时,callback方法从不执行。 只有当数据是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在服务器上换行符?


更新

尽pipe用''replace'\n'的build议不起作用,但这是接近正确的解决scheme。 此代码删除了违规字符:

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

如果你想保持断行,你可以尝试:

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

换行符不是问题,因为它们需要在JSON中正确转义。 如果它是可用的,你可以使用json_encode自动转义换行符。 如果不这样做,你可以使用类似Pim Jager的方法,尽pipe一个合适的JSON编码器是最好的。

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

我遵循这里提到的规则。 我只用了我需要的东西,但是我觉得你可以用你所用的语言来适应你的需求。 在我的情况下,问题不是像我原先想的那样是关于换行符,而是关于/不被转义。 我希望这可以防止别人从我头痛的头脑中搞清楚我做错了什么。

你是否像<br />或换行符那样得到换行符? 但是尝试用PHPreplace它们。

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

或者查看urlencode

像Terw,但用\ nreplace

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

应该删除所有换行符,jquery不应该故障转移
标签,但换行符不应该在JSON中。

你有没有尝试过

 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上为我工作

很简单,试试吧:

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

我已经testing过它,它工作完美。 无需添加复杂的function。

如果其他响应不起作用,则可以除去空格以外的所有空白字符。

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

来自: https : //github.com/joomla/joomla-cms/issues/14502

您也可以使用<pre>标签来保留所有换行符和空格。 我张贴这个答案,因为我也遇到这个问题,并为解决scheme,我达到了这个问题,之后,我随机决定使用<pre>标记,而不是<div>并解决了问题,虽然在许多地方有不必要的反斜杠\