programing

jQuery에서 줄 바꿈이 포함된 JSON 형식의 텍스트를 검색할 때 문제가 발생함

elecom 2023. 4. 3. 21:16
반응형

jQuery에서 줄 바꿈이 포함된 JSON 형식의 텍스트를 검색할 때 문제가 발생함

JSON 형식의 텍스트를 검색할 때 이상한 문제가 발생합니다. jQuery를 합니다.post정상적으로 동작하는 서버(PHP 실행 중)에 데이터를 송신합니다(JSON 형식도 있습니다).다음 jQuery를 하면 jQuery는 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);

}

줄 바꿈을 유지하고 싶은 경우는, 다음과 같이 해 주세요.

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와 같은 방법을 사용할 수 있지만 적절한 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 />와 같은 줄 바꿈이나 \n과 같은 줄 바꿈이 있습니까?하지만 PHP로 대체해 보세요.

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

또는 urlencode를 확인합니다.

Turw와 비슷하지만 교환으로 \n

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

테스트를 해봤는데 완벽하게 작동합니다.복잡한 기능을 추가할 필요가 없습니다.

다른 응답이 작동하지 않으면 공백을 제외한 모든 공백을 제거할 수 있습니다.

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

송신원: https://github.com/joomla/joomla-cms/issues/14502

를 사용할 수도 있습니다.<pre>모든 줄 바꿈과 공백을 유지하는 태그입니다.저도 그 문제에 부딪혀서 이 질문에 도달한 후 무작위로 사용하기로 결정했기 때문에 이 답변을 올렸습니다.<pre>대신 태그를 붙이다<div>그리고 그것은 많은 곳에서 원치 않는 등의 슬라쉬가 있었지만 문제로 해결되었다.\

언급URL : https://stackoverflow.com/questions/395379/problem-when-retrieving-text-in-json-format-containing-line-breaks-with-jquery

반응형