source

html 문자열을 값으로 사용할 수 없습니다.

ittop 2023. 3. 13. 20:53
반응형

html 문자열을 값으로 사용할 수 없습니다.

나는 지금 꽤 오랫동안 이 아약스를 디버깅하고 있다.jQUERY 파일에 다음과 같은 내용이 있습니다.

$("#typeForm").ajaxForm({
    success : function(html){
        alert(html);
}).submit();

이것은 서비스를 호출합니다.php, 그리고 그 안에는 다음과 같은 것이 있습니다.

$data = array('upload_data' => $this->upload->data());
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));

이거 안 되겠다.하지만 대체함으로써$str로.$str = "HELLO WORLD";jQuery는 내가 예상해야 할 것을 경고합니다.무슨 문제라도 있습니까?

편집:

다음은 출력 화면입니다.

여기에 이미지 설명 입력

경보가 발생하지만 jQuery를 다음과 같이 수정하면 다음과 같습니다.

$("#typeForm").ajaxForm({
    success : function(html){
        var obj = $.parseJSON(html);
        alert(obj);
}).submit();

그러면 아무것도 하지 않고 경보도 하지 않습니다.

var_dump을 했습니다.json_encode여기 덤프가 있습니다.부정한 형식의 JSON:

string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!&lt;\/span&gt;&lt;\/div&gt;"}"
</span></div>

다음은 서비스 내용입니다.php

class Service extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $filename = 'uploadfile';

        $config['upload_path'] = './uploads/temp';
        $config['allowed_types'] = 'jpg|png|gif|doc|docx|pdf|ppt|pptx|xls|xlsx|bmp';
        $config['max_size'] = '3072';
        $config['encrypt_name'] = TRUE;
        $config['remove_spaces'] = TRUE;

        $this->load->library('upload', $config);

        if (!$this->upload->do_upload($filename))
        {
            $error = array('error' => $this->upload->display_errors());
                    echo json_encode(array('error' => $error['error']));
        }
        else
        {
            $data = array('upload_data' => $this->upload->data());
            $file_name = $data['upload_data']['file_name'];
            //print_r($data);
            //echo json_encode(array('test' => "Hello World"));
            $str = "<div style='position:relative;'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
            $str2 = json_encode(array("file_name" => $file_name, "prompt" => $str));
            //var_dump($str2);
            exit(json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str)));
        }
    }
}

저도 같은 문제를 겪고 있었어요json_encode하지만 많은 테스트 끝에 올바른 해결책을 찾았습니다.

어레이 또는 문자열을 인코딩하는 PHP:

json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);

동일한 디코딩을 위한 JS:

var d = $.parseJSON(content);

이러한 상황에서 문제를 해결하는 것뿐만 아니라 잠재적인 문제 문자를 모두 변환해 보십시오.

die(json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE));

http://php.net/manual/en/function.json-encode.php

http://php.net/manual/en/json.constants.php

이에 적합한 솔루션을 찾을 수 없는 경우 값을 base64 인코딩으로 인코딩할 수 있습니다.

$data = array('upload_data' => $this->upload->data());
$str = base64_encode("<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>");
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));

클라이언트 디코딩에서는 IMO가 더 안전합니다.다른 언어의 문자를 처리하는 경우에도 더 적합합니다.

기타:

json 문자열 종료에 다른 문자가 추가되지 않도록 합니다.인쇄 후 기입합니다.

몇 가지 시도해 볼 수:

ajaxForm은 dataType 인수를 지원합니다.서버에서 JSON이 전송될 것으로 예상되는 경우 를 사용합니다.dataType: json그렇게

$("#typeForm").ajaxForm({
    success : function(html){
       // html here is already automatically a json object
       alert(html.prompt);
    },
    dataType: 'json'
}).submit();

전체 서비스를 게시해 주시겠습니까?또는 다음을 시도합니다.

exit(json_syslog(array_syslogfile_name' => $data['syslog_data']['file_name'], 'syslog' => $str));

--편집 --

json_encode가 이러한 이상한 문자열 :s를 반환하는 이유는 확실하지 않습니다.json_encode표준 php 라이브러리 또는 외부 라이브러리?php 설치에 json_encode가 없는 서버도 있기 때문에 물어봅니다.로컬에서 php internal json_encode를 사용하여 테스트했는데 정상적으로 동작합니다.

<?php
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('prompt' => $str));

// output
//{"prompt":"<div style='position:relative'><img src='\/assets\/ui\/success.png' \/><span style='position:relative;top:-15px;'>Nachricht empfangen!<\/span><\/div>"}

서버측에서 인용을 회피해야 할 것 같습니다.그 안에 있기 때문에 유효하지 않은 JSON 스트링이 작성되고 있는 것 같습니다.

string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!&lt;\/span&gt;&lt;\/div&gt;"}"
</span></div>

빠져나갈 견적이 없어 고장난 것 같습니다.이스케이프되지 않은 "가 발견되면 예상한 JSON 구조가 깨집니다.이스케이프 "는 \, 작은따옴표는 \'로 묶어야 합니다.

는 '아예'로만 .prompt어레이의 오브젝트 전부가 아닙니다.음음음같 뭇매하다

$("#typeForm").ajaxForm({
    success : function(html){
        var obj = $.parseJSON(html);
        alert(obj.prompt);
}).submit(); 

은 JSON과 잘 않습니다.string 메서드에서 __toString()에 가깝습니다. - 불가능에 가깝습니다.json_encode()이런 거에 조금이라도 닿을 수 있는 건 뭐든지요

<?php
/**
 * DEBUGGING NIGHTMARE
 * SO MUCH FUN, 10/10,
 */
class Nightmare {
  protected $str;
  public function __construct($str) {
    $this->str = $str;
  }
  public function __toString() {
    return $this->str;
  }
}

$test = new Nightmare('Hello Friends.');
echo $test;
> Hello Friends.

// cooool, so let's JSON the hell out of it, EASY

echo json_encode(['our_hello' => $test]);
// This what you expect to get, right?
> {"our_hello":"Hello Friends."}

// HAHA NO!!!
// THIS IS WHAT YOU GET:
> {"our_hello":{}}


// and this is why is that:

var_dump($test);
object(Nightmare)#1 (1) {
  ["str":protected]=>
  string(14) "Hello Friends."
}

print_r($test);
Nightmare Object
(
    [str:protected] => Hello Friends.
)

언급URL : https://stackoverflow.com/questions/9764598/json-encode-not-working-with-a-html-string-as-value

반응형