我使用PHP在数据库中存储格式化字符串。并在HTML表格td中显示字符串。我的示例文本是-
<font color="#0033CC"><b>water </b>releasing<i> H<sub>3</sub>O<sup>+</sup></i> ions; </font>
在td中显示时,它只显示原始数据而不是格式化的文本。我在浏览器中查看了源代码,发现以下数据。
<td><font color="#0033CC"><b>water </b>releasing<i> H<sub>3</sub>O<sup>+</sup></i> ions; </font></td>`
表示"被替换为"
>被替换为>
,以此类推。
在PHP中是否有任何内置的方法来避免这种情况并显示格式化的文本?
提前感谢!
可以使用html_entity_decode();
<?php
$orig = 'J''ai "sorti" le <strong>chien</strong> tout à l''heure';
$a = htmlentities($orig);
$b = html_entity_decode($a);
echo $a; // J'ai "sorti" le <strong>chien</strong> tout &agrave; l'heure
echo $b; // J'ai "sorti" le <strong>chien</strong> tout à l'heure
?>
实际上我在存储数据时犯了错误。我首先使用下面的方法来处理数据。//$data = stripslashes($data);//$data = htmlspecialchars($data);注释后,这两个方法解决了我的问题
首先,在保存数据之前不要对HTML特殊字符进行编码。
你最好在print
/echo
之前做。
<?php
function h($str)
{
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
$data = get_something_data_from_database();
/* More logic... */
?>
<!DOCTYPE html>
<title>Example</title>
<meta charset="UTF-8">
<div><?=h($data)?></div>
是的,<?=h(...)?>
是一个习语。(<?=...?>
是echo
的缩写语法)
或者您需要允许用户输入原始HTML?未经过滤或验证,它给我们带来了主要的漏洞: 跨站点脚本。为此,您需要使用HTML净化器