【问题标题】:How do I JSON Encode HTML in PHP?如何在 PHP 中对 HTML 进行 JSON 编码?
【发布时间】:2017-05-12 00:21:15
【问题描述】:

我正在使用 AJAX 和 PHP 创建帖子并立即显示它。我的 php 代码可以创建帖子,但我无法进行 json 编码以显示刚刚创建的帖子。像这样编码 html 似乎在每个 / 之前添加一个 \ 导致 html 以一种奇怪的方式中断和显示。 (我使用的是 json 编码,因为如果出现错误,我需要一个变量来知道它是否是错误,并将错误显示在与帖子不同的位置)

这是我要编码的内容

$data = "<article class='post'><div class='post-head cf'>
         <a class='userpic' href=''><img src='$userpic' alt='".$rowuser['username']."'></a>
         <a href='' class='username'>".$rowuser['username']."</a></div>
         <img src='users/user_".$rowuser['user_id']."/posts/".$row['image']."' alt=''>
         <div class='post-body'>
         <div class='post-options'>
         <a class='likes' href=''>156 likes</a>
         </div>
         <p><a class='username' href=''>".$rowuser['username']."</a>".$row['body']."</p>
         <hr /><div class='cf'>
         <a class='like hide-text' href='javascript:;'>Like This Post</a>
         <form action='' class='comment'>
         <input type='text' placeholder='Add a comment'></form></div>
         </div></article>";

echo json_encode($data);

【问题讨论】:

  • 为什么是 JSON?没有理由不使用 html...
  • @Jonasw 创建帖子时,上传图片时可能会出现很多问题,如果是这种情况,我需要能够显示错误。在 ajax 中,我将响应添加到提要之前,但如果出现错误,我希望将响应附加到不同的 div 以防出错。为了做到这一点,我必须使用 JSON 发送一个变量加上响应,如果有错误,首先检查 ajax,然后选择显示响应的位置。现在如果没有错误,ajax 已经在寻找一个 json 对象,如果它没有收到它,它不会做任何事情

标签: javascript php jquery json ajax


【解决方案1】:

将错误作为字符串包装到 json 中: response.php

{
<?php If(someerror){ ?>
error:"<html>yourhtml</html>",
 <?php } ?>
}

现在你可以这样做了:

$.ajax("response.php",function(data){
   data=JSON.parse(data);
   if(data.error){
      $("#error").append(data.error);
      return;
   }
    //work with the obj (data)
   });

【讨论】:

    【解决方案2】:

    像这样编码 html 似乎会在每个 / 之前添加一个 \ 要打破的html

    PHP is escaping the slashes while encoding。这可以通过在调用json_encode() 时添加JSON_UNESCAPED_SLASHES 标志来防止:

    $data = "<html></html>";
    
    $escaped = json_encode($data);
    // string(16) ""<html><\/html>""
    var_dump($escaped);
    
    $unescaped = json_encode($data, JSON_UNESCAPED_SLASHES);
    // string(15) ""<html></html>""
    var_dump($unescaped);
    

    【讨论】:

    • 看起来这行得通!!!然而,它也吐出“”包装变量的html:s无论如何我可以删除它吗?我知道我可能可以用 jquery 做到这一点,但宁愿在此之前删除它们
    • 如果您选择删除它,它将不再是有效的 JSON,它只是一堆 HTML。当然,如果你想要 echo $dataecho json_encode($data, ...),你可以只 echo 不使用 json_encoding 的 HTML?
    • 嗯,好吧,我想我只是在 jquery 上使用 slice 来删除它们,非常感谢
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2011-07-20
    • 2011-09-09
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多