【问题标题】:Problem when retrieving text in JSON format containing line breaks with jQuery使用 jQuery 检索包含换行符的 JSON 格式文本时出现问题
【发布时间】:2010-09-28 13:34:01
【问题描述】:

我在检索 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);

}

【问题讨论】:

    标签: jquery json tinymce line-breaks


    【解决方案1】:

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

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

    发件人:https://github.com/joomla/joomla-cms/issues/14502

    【讨论】:

      【解决方案2】:

      简单,试试吧:

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

      我已经对其进行了测试,并且效果很好。无需添加复杂的功能。

      【讨论】:

        【解决方案3】:

        您还可以使用&lt;pre&gt; 标记来保留所有换行符和空格。 我发布这个答案是因为我也遇到了这个问题,并且我找到了这个问题的解决方案,之后我随机决定使用 &lt;pre&gt; 标签而不是 &lt;div&gt; 并通过问题解决了,尽管在很多地方都有不需要的反斜杠\

        【讨论】:

          【解决方案4】:

          你试过了吗

          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 上对我有用

          【讨论】:

            【解决方案5】:

            我在 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 中提到的规则。 我只使用了我需要的东西,但我认为你可以用你使用的语言来适应你的需要。在我的情况下,问题不在于我最初认为的换行符,而在于 / 没有被转义。我希望这可以防止其他人因为我弄清楚我做错了什么而感到头疼。

            【讨论】:

              【解决方案6】:

              如果您想保留换行符,您可以尝试:

              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】:

                换行符不是问题,因为它们需要在 JSON 中正确转义。如果您可以使用它,您可以使用自动转义换行符的json_encode。如果做不到这一点,你可以使用上面 Pim Jager 的方法,不过最好使用合适的 JSON 编码器。

                【讨论】:

                  【解决方案8】:

                  与 Terw 类似,但替换为 \n

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

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

                  【讨论】:

                    【解决方案9】:

                    你有像
                    这样的换行符还是像 \n 这样的换行符? 但是尝试用 PHP 替换它们。

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

                    或查看urlencode

                    【讨论】:

                    • 我不确定,确切地说。当我浏览存储文本的数据库条目时,它只是在 phpMyAdmin 中显示为一个新行,因此我看不到特定的字符表示。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-04-04
                    • 2011-09-02
                    • 2017-07-09
                    • 1970-01-01
                    • 2020-01-13
                    • 2020-08-11
                    • 1970-01-01
                    相关资源
                    最近更新 更多