我将 HTML 和文本数据以其原始形式存储在我的数据库表中 - 但是我在使其正确输出方面遇到了一些小问题。以下是按原样存储在表中的一些示例数据:
<p>Professional Freelance PHP & MySQL developer based in Manchester.
<br />Providing an unbeatable service at a competitive price.</p>
要输出此数据,我这样做:
echo $row['details'];
这会正确输出数据,但是当我进行 W3C 验证器检查时,它会显示:
character "&" is the first character of a delimiter but occurred as data
所以我尝试使用
htmlemtities
和 htmlspecialchars
但这只会导致 HMTL 标签在页面上输出。
这样做的正确方法是什么?
使用
&
代替 &
。
你想做的是使用php函数
htmlentities()
...$mything = "<b>BOLD & BOLD</b>";
//normally would throw an error if not converted...
//lets convert!!
$mynewthing = htmlentities($mything);
现在,只需将
$mynewthing
插入您的数据库!!
htmlentities
基本上是 htmlspecialchars
的超集,并且 htmlspecialchars
也替换 <
和 >
。
实际上,您想要做的是修复无效的 HTML 代码,我认为这需要一个临时解决方案:
$row['details'] = preg_replace("/&(?![#0-9a-z]+;)/i", "&", $row['details']);
这不是一个完美的解决方案,因为它对于像这样的字符串会失败:
someone&son;
(带有尾随的;
),但至少它不会破坏现有的 HTML 实体。
但是,如果您对如何存储数据有决定权,请强制要求数据库中存储的 HTML 代码是正确的。
在我的项目中,我使用 XSLT 解析器,因此我必须将
更改为  
(例如)。但这是我发现的安全方式...
这是我的代码
$html = trim(addslashes(htmlspecialchars(
html_entity_decode($_POST['html'], ENT_QUOTES, 'UTF-8'),
ENT_QUOTES, 'UTF-8'
)));
当你从数据库读取数据时,不要忘记使用 stripslashes();
$html = stripslashes($mysq_row['html']);