检索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);
}
答案 0 :(得分:46)
如果您想保持换行符,可以尝试:
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;
}
答案 1 :(得分:7)
换行不是问题,因为它们需要在JSON中正确转义。如果您可以使用它,则可以使用json_encode自动转义换行符。如果做不到这一点,你可以使用上面的Pim Jager方法,尽管合适的JSON编码器是最好的。
答案 2 :(得分: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.'"';
}
}
我遵循了here提到的规则。 我只使用了我需要的东西,但我认为你可以用你正在使用的语言来适应你的需求。在我的情况下,问题不在于我最初的想法,而是关于/没有被转义。我希望这可以防止别人因为我弄错了我的错误而头疼。
答案 3 :(得分:1)
你得到像< br />这样的换行符吗?还是像\ n? 但是尝试用PHP替换它们。
<?php
$string = 'asdfasf<br />asdfasf';
echo str_replace('<br />', '', $strin); // Replace <br /> with '' (nothing)
?>
或查看urlencode
答案 4 :(得分:1)
喜欢Terw,但替换\ n
<?php
$json = str_replace('\n', '', $json);
?>
应该删除所有换行符,jquery不应该故障转移
标签,但换行符不应该是JSON。
答案 5 :(得分: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
答案 6 :(得分:1)
简单,只需尝试:
<?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
我测试了它,它完美无缺。无需添加复杂的功能。
答案 7 :(得分:1)
如果其他响应不起作用,则可以删除除空格之外的所有空白字符。
PHP
$text = trim(preg_replace( "/[\\x00-\\x19]+/" , '' , $text));
答案 8 :(得分:0)
您还可以使用<pre>
标记来保留所有换行符和空格。
我发布这个答案是因为我也遇到了这个问题,并且我已经解决了这个问题,之后我随机决定使用<pre>
标签而不是<div>
并且尽管在很多地方都有问题解决了是不需要的反斜杠\