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

所以我尝试使用htmlemtitieshtmlspecialchars但这只会导致 HMTL 标签在页面上输出。

这样做的正确方法是什么?

4

4 回答 4

10

使用&amp;而不是&.

于 2013-06-15T21:21:37.640 回答
5

您要做的是使用 php 函数htmlentities()...
它将您的输入转换为 html 实体,然后在输出时将其解释为 HTML 并作为该 HTML 的结果输出...
例如:

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

现在,只需插入$mynewthing您的数据库!

于 2013-06-15T21:28:35.890 回答
2

htmlentities基本上是 , 的超集htmlspecialchars,也htmlspecialchars取代了<and >

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

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

这不是一个完美的解决方案,因为它对于像这样的字符串会失败:(someone&son;带有尾随;),但至少它不会破坏现有的 HTML 实体。

但是,如果您对数据的存储方式有决定权,请确保存储在数据库中的 HTML 代码是正确的。

于 2013-06-15T21:21:13.343 回答
0

在我的项目中,我使用 XSLT Parser,所以我不得不更改&nbsp;&#160;(例如)。但这是我发现的安全方式......

这是我的代码

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

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

$html = stripslashes($mysq_row['html']);
于 2013-06-15T21:30:22.003 回答