字符“&”是分隔符的第一个字符,但作为数据出现

问题描述 投票:0回答:4

我将 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 html html-encode
4个回答
11
投票

使用

&amp;
代替
&


4
投票

你想做的是使用php函数

htmlentities()
...
它将您的输入转换为 html 实体,然后当输出时,它将被解释为 HTML 并作为该 HTML 的结果输出...
例如:

$mything = "<b>BOLD & BOLD</b>";
//normally would throw an error if not converted...
//lets convert!!
$mynewthing = htmlentities($mything);

现在,只需将

$mynewthing
插入您的数据库!!


2
投票

htmlentities
基本上是
htmlspecialchars
的超集,并且
htmlspecialchars
也替换
<
>

实际上,您想要做的是修复无效的 HTML 代码,我认为这需要一个临时解决方案:

$row['details'] = preg_replace("/&(?![#0-9a-z]+;)/i", "&amp;", $row['details']);

这不是一个完美的解决方案,因为它对于像这样的字符串会失败:

someone&son;
(带有尾随的
;
),但至少它不会破坏现有的 HTML 实体。

但是,如果您对如何存储数据有决定权,请强制要求数据库中存储的 HTML 代码是正确的。


0
投票

在我的项目中,我使用 XSLT 解析器,因此我必须将

&nbsp;
更改为
&#160;
(例如)。但这是我发现的安全方式...

这是我的代码

$html = trim(addslashes(htmlspecialchars(
        html_entity_decode($_POST['html'], ENT_QUOTES, 'UTF-8'),
        ENT_QUOTES, 'UTF-8'
    )));

当你从数据库读取数据时,不要忘记使用 stripslashes();

$html = stripslashes($mysq_row['html']);
© www.soinside.com 2019 - 2024. All rights reserved.