使用 jQuery 检索包含换行符的 JSON 格式文本时出现问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/395379/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Problem when retrieving text in JSON format containing line breaks with jQuery
提问by Morten Christiansen
I'm having a strange problem when retrieving JSON formatted text. I use jQuery post
to send some data (also JSON formatted) to the server (running PHP) which works fine. Then, when I request the same data from the server using jQuery get
, the callback method never executes. This only occurs when the data is JSON formatted and the data contains a line break. When I don't use JSON formatting it works fine. What baffles me is that there are no problems with uploading the data.
我在检索 JSON 格式的文本时遇到了一个奇怪的问题。我使用 jQuerypost
将一些数据(也是 JSON 格式的)发送到工作正常的服务器(运行 PHP)。然后,当我使用 jQuery 从服务器请求相同的数据时get
,回调方法永远不会执行。这仅在数据为 JSON 格式且数据包含换行符时发生。当我不使用 JSON 格式时,它工作正常。令我困惑的是,上传数据没有问题。
Uploading code: (works)
上传代码:(有效)
$.post("ajax/contents_ajax.php", {
'title': caption,
'text': frameText().getContent(),
'image_id': img
},
//Callback
Download code: (doesn't work with line breaks)
下载代码:(不适用于换行符)
$.get("ajax/contents_ajax.php", { 'get_item': id },
function (data){
//Never gets executed if data contains line breaks
}
,'json');
The whole problem stems from the fact that the TinyMCE rich text editor seems to insist on inserting line breaks everywhere, even though I enabled the option
整个问题源于 TinyMCE 富文本编辑器似乎坚持在任何地方插入换行符,即使我启用了该选项
remove_linebreaks : true
I do prefer to have line breaks, but not if they break my code. Can anyone tell me what the problem is here, and perhaps how I can encode the linebreaks on the server with PHP?
我确实更喜欢换行,但如果它们破坏了我的代码,则不会。谁能告诉我这里的问题是什么,也许我可以用 PHP 对服务器上的换行符进行编码?
Update
更新
While the suggestions to replace '\n'
with ''
did not work, it was close to the right solution. This code removed the offending characters:
虽然替换'\n'
为的建议''
不起作用,但它接近正确的解决方案。此代码删除了有问题的字符:
function parse($text){
$parsedText = str_replace(chr(10), "", $text);
return str_replace(chr(13), "", $parsedText);
}
回答by eyelidlessness
If you would like to keepthe line breaks, you might try:
如果您想保留换行符,您可以尝试:
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;
}
回答by xobofni
Line breaks aren't the issue so much as they need to be properly escaped in JSON. If it's available to you, you can use json_encodewhich automatically escapes newlines. Failing that, you can use something like Pim Jager's method above, though a proper JSON encoder would be best.
换行符不是问题,因为它们需要在 JSON 中正确转义。如果您可以使用它,您可以使用json_encode自动转义换行符。如果做不到这一点,您可以使用上面 Pim Jager 的方法,但最好使用适当的 JSON 编码器。
回答by GabrielP
I encountered that problem while making a class in PHP4 to emulate json_encode (available in PHP5). Here's what i came up with :
我在 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.'"';
}
}
I followed the rules mentionned here. I only used what i needed but i figure that you can adapt it to your needs in the language your are using. The problem in my case wasn't about newlines as i originally thought but about the / not being escaped. I hope this prevent someone else from the little headache i had figuring out what i did wrong.
我遵循了这里提到的规则。我只使用了我需要的东西,但我认为你可以用你正在使用的语言来适应你的需求。在我的情况下,问题不在于我最初想到的换行符,而是关于 / 没有被转义。我希望这可以防止其他人因为我发现自己做错了什么而感到头疼。
回答by r4wi
Have you tried this
你有没有试过这个
update tablename set field_name_with_\r\n_in_it = replace(field_name_with_\r\n_in_it,"\r\n","<br />")
It worked for me on mysql 5.0.45
它对我有用 mysql 5.0.45
回答by ThoKra
回答by Pim Jager
Like Terw but with replacing \n
像 Terw 但替换了 \n
<?php
$json = str_replace('\n', '', $json);
?>
Should remove all line breaks, jquery shouldn't fail over
tags, but line breaks should not be in JSON.
应该删除所有换行符,jquery 不应该故障转移
标签,但换行符不应该在 JSON 中。
回答by alex t
Easy, just try:
很简单,试试吧:
<?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
I have tested it and it works perfect. No need to add complicated functions.
我已经对其进行了测试,并且效果很好。无需添加复杂的功能。
回答by medskill
If the other responses didn't work, it's possible to strip all whitespace characters except the space.
如果其他响应不起作用,则可以去除除空格之外的所有空白字符。
PHP
$text = trim(preg_replace( "/[\\x00-\\x19]+/" , '' , $text));
PHP
$text = trim(preg_replace( "/[\\x00-\\x19]+/" , '' , $text));
回答by Ravinder Payal
You can also use <pre>
tag that will keep all line breaks and white spaces.
I am posting this answer because i also encounter that problem and for solutions i reached to this question and after that I randomly decided to use <pre>
tag instead of <div>
and that solved by problem although at many places there were unwanted back slashes \
您还可以使用<pre>
标签来保留所有换行符和空格。我发布这个答案是因为我也遇到了这个问题,为了解决这个问题,我随机决定使用<pre>
标签而不是<div>
通过问题解决,尽管在很多地方都有不需要的反斜杠\