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

使用htmlspecialchars()在PHP中回显干净的文本,php,html,textarea,echo,htmlspecialchars,Php,Html,Textarea,Echo,Htmlspecialchars,我有一个用户表单,用户可以在文本区域中输入文本,然后更改文本 以下是我的HTML文本区域示例: <textarea class="form-control" rows="4" name="answer_text" type="text"> <?php echo strip_tags(nl2br(htmlspecialchars($answers['answer_text']))); ?> &l

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

以下是我的HTML文本区域示例:

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

  • 文本输入:
    “这是文本”

  • 文本输出(回显):
    “这是文本”

  • 所需/预期输出:
    “这是文本”

为了避免回声中出现

,我使用了:
strip\u tags()
要显示换行符,我使用:
nl2br()
出于安全原因,我使用
htmlspecialchars()

然而,如果用户在其文本中使用引号(“或”),我会在我的文本回音中得到
。我可以通过删除
htmlspecialchars()
来解决这个问题,但我认为在这里使用它很重要。是否有可能获得正确的输出,即显示的是引号而不是

编辑:
我使用了两次
htmlspecialchars()
。一次是在通过
$\u POST=htmlspecialchars($value)
获取用户输入值期间将其发送到表中,另一次是在HTML回送期间,如上所示

正如@Cbroe所解释的,出现问题的原因是数据被编码了两次;首先-然后,在第二次编码过程中,其中的-,变成了
&

正确的方法是,在我的例子中,我在SQL
INSERT
UPDATE
期间不使用
htmlspecialchars()
(我使用PDO准备的语句),并且在HTML回显期间根据情况只使用
htmlspecialchars()

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

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


为什么您认为您需要htmlspecialchars?可能是我对函数理解错误,但这是为了避免用户将一些代码带入我的数据库(SQL注入)。文本是通过使用PHP PDO查询插入的。您也可以通过PDO来准备数据,而不是。当然,在您实际创建HTML输出时,使用htmlspecialchars是有意义的——您正在使用您所展示的代码创建HTML输出。想象一下,如果我在这个表单中输入的文本是
foobar baz
,那么如果您没有应用任何形式的转义,您生成的HTML代码会是什么样子?不,这不是“好的”,这正是错误的方法。在数据库插入部分使用它一开始就是错误的。尝试留下一个代码示例,以便更好地理解。