啊,我从来不喜欢 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/