使用 htmlspecialchars() 在 PHP 中回显干净的文本

问题描述

我有一个用户表单,让用户可以在文本区域中输入文本并稍后更改文本。

这是我的 HTML 文本区域示例:

<textarea class="form-control" rows="4" name="answer_text" type="text">
<?PHP echo strip_tags(nl2br(htmlspecialchars($answers['answer_text']))); ?>
</textarea>
  • 文本输入:"This is text"
  • 文本输出(回显):&quot;This is text&quot;
  • 期望/预期输出"This is text"

为了避免回声中的 <br>,我使用:strip_tags()显示换行符,我使用:nl2br() 出于安全原因,我使用 htmlspecialchars()

但是,如果用户在他的文本中使用引号(" 或 ""),我会在文本回显中得到 &quot;。我可以通过删除 htmlspecialchars()解决这个问题,但我认为这很重要在这里使用它。有没有机会得到正确的输出意味着显示的是引号而不是 &quot;

编辑:
我使用了两次 htmlspecialchars()。在通过 $_POST = htmlspecialchars($value) 获取用户输入值以将其发送到表格期间一次,在 HTML 回显期间作为第二次,如上所示。

正如@Cbroe 所解释的,问题的发生是因为数据被编码了两次。最初它 " 变成了 "first - 然后,在第二次编码期间,它的 & 变成了 &amp;

正确的方法是在我的情况下,我在 sql htmlspecialchars()INSERT 期间不使用 UPDATE(我使用 PDO 准备好的语句)并且只在期间使用 htmlspecialchars()视情况而定的 HTML 回显。

解决方法

尝试使用 htmlentities() 而不是 htmlspecialchars()。 像这样:

<textarea class="form-control" rows="4" name="answer_text" type="text">
<?php echo strip_tags(nl2br(htmlentities($answers['answer_text']))); ?>
</textarea>