【问题标题】:Escaping double quotes in a value for a sticky form in PHP在 PHP 中为粘性表单的值转义双引号
【发布时间】:2010-09-21 09:34:10
【问题描述】:

我在制作一个粘性表单时遇到了一点麻烦,如果值有双引号,它会记住在表单提交时输入的内容。问题是 HTML 应该是这样的:

<input type="text" name="something" value="Whatever value you entered" />

但是,如果短语:“我该怎么做?”用引号输入,生成的 HTML 类似于:

<input type="text" this?="" do="" i="" how="" value="" name="something"/>

如何过滤双引号?我已经尝试过打开和关闭魔术引号,我使用了stripslashes 和addslashes,但到目前为止我还没有遇到正确的解决方案。解决 PHP 问题的最佳方法是什么?

【问题讨论】:

  • 这不是生成的 HTML,而是在您的浏览器 [mis] 解释和破坏它之后生成的 DOM 节点的表示。

标签: php validation forms filtering


【解决方案1】:

这是我使用的:

htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, 'UTF-8')
  • ENT_QUOTES 告诉 PHP 转换单引号和双引号,我觉得这很可取。
  • ENT_SUBSTITUTEENT_DISALLOWED 处理无效的 Unicode。它们非常相似 - 据我了解,第一个替换无效的代码单元序列,即 无效编码的字符或不代表字符的序列,而第二个替换给定文档的无效代码点类型,即指定的文档类型不允许的字符(如果未明确指定,则为默认值)。 documentation 在他们身上过于简洁。
  • ENT_HTML5 是我使用的文档类型。您可以使用不同的,但它应该与您的页面文档类型匹配。
  • UTF-8 是我的文档的编码。我建议,除非您绝对确定您使用的是 PHP 5.4.0,否则您明确指定编码 - 特别是如果您要处理非英文文本。我做一些工作的主机使用 5.2.something,默认为 ISO-8859-1 并产生乱码。

正如 thesmart 建议的那样,htmlspecialchars 仅编码保留的 HTML 字符,而 htmlentities 转换具有 HTML 表示的所有内容。在大多数情况下,两者都可以胜任。 Here 是关于这个主题的讨论。

还有一件事:最好禁用魔术引号,因为它们给人一种虚假的安全感,并且在 5.3.0 中已被弃用并从 5.4.0 中删除。如果启用它们,则您字段中的每个引用都将在回发时添加一个反斜杠(并且多个回发将添加越来越多的斜杠)。我看到 OP 能够更改设置,但供将来参考:如果您在共享主机上或无法访问 php.ini,最简单的方法是添加

php_flag magic_quotes_gpc Off

.htaccess 文件。

【讨论】:

【解决方案2】:

上面将编码各种具有 html 实体代码的字符。我更喜欢使用:

htmlspecialchars($myValue, ENT_QUOTES, 'utf-8');

这只会编码:

'&' (ampersand) becomes '&amp;'
'"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
'<' (less than) becomes '&lt;'
'>' (greater than) becomes '&gt;'

您还可以在 $myValue 上执行 strip_tags 以删除 html 和 php 标签。

【讨论】:

  • 另外,请确保您的文本编码为 UTF-8。如果您愿意,通常可以省略 htmlspecialchars 中的最后一个参数。
  • 你不要指定字符集stackoverflow.com/questions/6181299/…
【解决方案3】:

你想要htmlentities()

&lt;input type="text" value="&lt;?php echo htmlentities($myValue); ?&gt;"&gt;

【讨论】:

  • 谢谢,成功了。我不知道为什么我没有想到这一点。
  • htmlspecialchars 应该足够了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多