在PHP

时间:2016-07-09 15:27:48

标签: php regex forms validation htmlspecialchars

我想知道是否有人知道如何解决这个问题。

我正在从HTML表单收集用户输入,然后使用htmlspecialchars将其发布到PHP中以避免在使用引号/ etc时出现问题...

但是,我还想对通过正则表达式收集的数据进行服务器端验证检查 - 虽然我不确定如何解决这个问题。

到目前为止,我已经想过解码htmlspecialchars - 但是因为我将立即使用Strings,这意味着在运行此转换后代码可能会中断。例如:假设用户在字段中输入单引号"。这将转换为",然后如果我解码并在变量中使用它,它最终可能会像:$ string = "" ";这将是给我一些问题。

对此有任何建议将不胜感激!

2 个答案:

答案 0 :(得分:1)

您似乎误解了数据之间的差异以及如何将此数据更改为在特定上下文中可解析。

php字符串可以包含任何数据。该字符串中存储的内容是" raw" form:我们想要在需要时操纵数据的形式。

在某些情况下,并非所有字符都有效。例如,在html textarea中,可能不会使用<>个字符,因为它们是特殊字符。我们仍然希望能够使用这些字符。要在上下文中使用特殊字符,我们转义这些字符。通过逃避一个特殊的角色,它失去了它的特殊含义。在html textarea的上下文中,<字符作为序列&lt;进行转义。与<字符不同,此转义序列在html中没有特殊含义,因此如果我们将以下序列发送到浏览器,它就知道如何解析该序列并显示正确的内容:{{1} }。当我们讨论此textarea包含的数据时,我们并未说它包含<textarea>&lt;</textarea>,而是说它包含&lt;

正如你所说,在php脚本中,在双引号字符串中,<字符具有特殊含义。这解析有关。 PHP根本不知道如何解析序列"。如果我们想要在这样的双引号字符串中使用双引号,我们需要转义它。我们在php双引号字符串中使用$str = """;前面的双引号进行转义。要使用双引号表示法创建包含单个双引号的字符串,您可以编写\

然而,这些都不重要。。您正在从html表单中获取输入。单击提交按钮时,浏览器将读取textarea中的内容(并将其解析为html )。然后,浏览器按照表单标记的方式对其进行编码,并将其发送到服务器。然后,服务器将文本blob解码回原始数据表单中。该数据将传递给PHP,您将在$str = "\"";中遇到此表单。

总之:如果对数据进行编码,请实现对其编码的上下文进行编码,并根据该上下文对其进行解码。你不需要为php引用的字符串转义,因为你正在处理内部字符串。没有什么可以解析的。提醒自己,当您打算在某处使用数据时,您应该注意转义该特定上下文的数据中的所有特殊字符。

答案 1 :(得分:0)

我认为在将表单发布到PHP之后,htmlspecialchars()函数被称为。最简单的解决方案是首先匹配正则表达式,然后执行htmlspecialchars()

此外,如果您使用htmlspecialchars()编码了字符串,则在使用htmlspecialchars_decode()解码后,PHP内部表示将为"\"",因此您不会中断任何内容。如何手动将字符串写入PHP文件以及PHP如何在内部处理它们有很大的不同。你真的不需要为此烦恼。