- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
啊,我从来不喜欢 PHP,它太“不纯”了……
现在我必须使用它,但我遇到了一个问题:主要是 html_entity_decode
和 htmlspecialchars_decode
似乎都不适合我。我把这个论坛都看了一遍,什么都没有。它似乎无处不在,只是在这里行不通......
我将电影的标题发送到数据库,全部编码,然后当我从数据库中获取它时,我用这个解码它:
$title = html_entity_decode($row['Title']);
然后:
"title":"'.$title.'"
它是我用 PHP 创建的 JSON 对象的一部分。虽然当我查看那个特定对象的属性时,它的标题没有被解码,但实际上没有任何变化。我尝试了问题标题中所述的两个函数,并尝试了像 UTF-8 这样的编码,还有一些选项,如 ENT_QUOTES 或 ENT_COMPAT,但它仍然不起作用。
有人能告诉我为什么 PHP 不服从我吗?
编辑:这是我在那里所做的全部工作:
echo 'var serverVideos = [';
while($row = mysql_fetch_array($result))
{
$currentRow++;
$data = array('posterSrc' => $row["Poster_name"],
'videoSrc' => $row["Video_name"],
'videoType' => $row["Type"]);
$title = html_entity_decode($row['Title']);
$poster = html_entity_decode($row['Poster_name']);
echo'{"id":"'.$row["ID"].'", "vimeoID":"'.$row["VimeoID"].'", "title":"'.$title.'" ,"client":"'.$row["Client"].'" , "production":"'.$row["Production"].'", "type":"'.$row["Type"].'", ';
if($row["Type"] != "vimeo")
{
echo '"href":"'.http_build_query($data).'"';
}
else
{
echo '"href":"'.$row["Video_name"].'"';
}
echo ', "poster":"'.$poster.'"}';
if($currentRow != $rowNumber)
{
echo ',';
}
}
echo '];';
抱歉,有点乱,在 Notepad++ 中看起来更好;/我实际上是在一个脚本标签中输出它来制作一个对象,我查看了 json_encode 并没有真正理解它如何帮助我,因为我不知道我将如何使用这么多变量,抱歉。
此外,这是使用来自该 JSON 对象的变量使用 javascript 制作标签后来自源代码的代码:
<a production=" " client=" " title="O.S.T.R &quot;Track #12&quot;" href="http://player.vimeo.com/video/43886787?title=1&amp;byline=1&amp;portrait=1" rel="shadowbox" class="box">
最佳答案
(我无法将其放入评论中,所以它必须是一个答案。)
这里真正的问题是数据放入数据库的方式。让我们看一下您提供的示例字符串:
$raw="O.S.T.R &quot;Track #12&quot;";
echo html_entity_decode($raw);
// O.S.T.R "Track #12"
echo html_entity_decode(html_entity_decode($raw));
// O.S.T.R "Track #12"
所以用户输入的是O.S.T.R "Track #12"
这里的关键概念是它应该如何存储在数据库中。因为那是实际数据。不要将修改后的版本存储在数据库中。相反,根据您需要的输出方式适本地转义数据。
这是我将用于以下几个示例的示例数据:
$title='O.S.T.R "Track #12"';
$description='A&B or A\B ??';
因此,当您在 SQL 语句中写入数据时,您使用 addslashes
(或准备好的语句,但我将在此处展示 addslashes 方法):
$sql="INSERT INTO xxx(title,description) VALUES('".addslashes($title)."','".addslashes($description)."')";
// INSERT INTO xxx(title,description) VALUES('O.S.T.R \"Track #12\"','A&B or A\\B ??')
对于json编码,使用json_encode:
$json=json_encode( array('title'=>$title,'description'=>$description) );
// {"title":"O.S.T.R \"Track #12\"","description":"A&B or A\\B ??"}
要编码为 csv,在日志文件中,使用 fputcsv:
$fp=fopen("my.csv","a");
fputcsv($fp, array($title,$description) );
fclose($fp);
// "O.S.T.R ""Track #12""","A&B or A\B ??"
要输出为 HTML,请使用 htmlspecialchars()(或 html_entity_encode()):
$html='<h3>'.htmlspecialchars($title).'</h3>';
$html.='<p>'.htmlspecialchars($description).'</p>';
// <h3>O.S.T.R "Track #12"</h3><p>A&B or A\B ??</p>
现在,也许我仍然没有说服您,您仍然真的想在数据库中存储 HTML 就绪数据,并且每次要将其用于其他任何事情时都需要额外的步骤来取消 html 化?在那种情况下,您的示例字符串应该如下所示:
O.S.T.R "Track #12"
而你的字符串看起来像:
O.S.T.R &quot;Track #12&quot;
你看出区别了吗?第一个只对 html 实体进行了一次编码。调用 html_entity_decode()
将正确解码。第二个对它们进行了两次编码。它不再被编码为 html 实体。这就是我们所说的double-entity-encoded-format 或简称 DEEF。 PHP 中没有deef_decode()
函数,我听说过的任何一种计算机语言,甚至比PHP 更纯粹的语言都没有。这是因为没有人需要这个功能。
总结:您的代码中有一个错误会写入他们的数据库。您正在接收带有已编码实体的字符串,但您在将它们写入数据库之前再次对它们进行编码。
结论:回到我上面给出的关键概念,您应该在将这些 html 实体写入数据库之前对其进行解码,而不是对它们进行第二次编码。但是,当您进行此更改时,请确保所有从数据库获取数据并将其放入 HTML 或 XML 的代码都知道它现在必须对实体进行编码。
关于PHP、html_entity_decode 和 htmlspecialchars_decode 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11281576/
这个问题已经有答案了: UTF-8 all the way through (13 个回答) 已关闭 8 年前。 我正在将 PHP 应用程序移动到另一台服务器,但在字符解码方面遇到一些问题: 旧服务器
编辑:我在发布问题后几秒钟就解决了它(抱歉!)但还不能接受答案。 大家好, 只是一个快速的。我有一个 PHP/CodeIgniter 网站,用户可以编辑他们的个人资料。我正在使用 CI 的 XSS 过
我在字符编码方面遇到问题。我已将其简化为以下脚本: '; // Stan's echo html_entity_decode($string).''; // Stan's echo htm
PHP html_entity_decode() 函数 实例 把 HTML 实体转换为字符: <?php $str = "<© W3CSçh
我正在尝试构建一个将 html_entity_decode 应用于对象和数组的函数。由于我事先不知道结构,子属性也可以是对象或数组,所以一个简单的递归函数似乎是可行的方法。我无法弄清楚为什么以下内容不
这个问题已经有答案了: Should we HTML-encode special characters before storing them in the database? (6 个回答) 已关
这是我的代码: $string = 'It'; $string = html_entity_decode($string); echo $string; 它应该回显“It”,但它只是回显
基本上我想像这样转动一个字符串: <div> blabla </div> 进入这个: <code> blabla </code> 我该怎么做?
我有一种情况,我将一个字符串传递给一个函数。我想在将 传递给函数之前将其转换为“”(空格)。 html_entity_decode 可以吗? 如果不行怎么办? 我知道 str_replace 但还
我一直在努力将一堆字符翻译成核心 utf-8 以将它们存储在我的数据库中。 PHP iconv 在许多字符上失败,所以我被迫构建我自己的“解决方案”,如果它不起作用,这真的不是一个解决方案,而且它在
我试图在我的产品页面(opencart v3)上输出产品的属性。 该属性称为“技术细节”,使用以下代码可以正常工作: {% if attribute_groups %} {% for attrib
我想我遇到了 html_entity_decode 的问题,这可能有一个我还没有找到的简单解决方案。这是我的问题,我有这个字符串: L'evento dell'anno 当我保存到数据库中时,会使用
我的 mysql 表保存文本 you'd 但是当我使用 php 获取该值并显示它时,我的浏览器将其显示为 you�d 我正在使用 html_entity_decode $answer = html_
$string = "susan's"; //string is scraped from website $string = html_entity_decode($string); $s
我正在寻找 PHP 的 javascript 版本 html_entity_decode .我发现了这个: function html_entity_decode(str){ var tarea=d
$string1 = 'Cotton Lanyard ½"'; $string2 = 'Organic Cotton Lanyard ⅝"'; echo html_enti
啊,我从来不喜欢 PHP,它太“不纯”了…… 现在我必须使用它,但我遇到了一个问题:主要是 html_entity_decode 和 htmlspecialchars_decode 似乎都不适合我。我
在一个单独的 YML 文件中,我有: flags: [] 当我将它调用到我的代码中时,它没有被解释,所以我使用了 html_entity_decode . 它有效,但我只有 1 个奇怪的字符在我的图像
我从昨天开始就一直在与这个问题作斗争——不幸的是无济于事(不完全是,我找到了某种解决方法),经过一些研究和重读文档后,我仍然有点目瞪口呆和困惑。 让我们假设有一个丑陋的字符串,它已经有正确的 html
从 php 5.4 html_entity_decode 引入了四个新标志,解释最少 ENT_HTML401 Handle code as HTML 4.01. ENT_XML1 Handle
我是一名优秀的程序员,十分优秀!