【问题标题】:PHP strip non-SGML characters from a string?PHP从字符串中去除非SGML字符?
【发布时间】:2011-07-12 03:07:30
【问题描述】:

我的数据库中有非标准字符(由于换行符)。

我的 HTML 验证器正在抱怨它们。

由于我的 HTML 验证器是我自我的直接延伸,我想保持快乐和绿色-ok-arrow-y。

以前做过这个的人有快速修复吗?

顺便说一句,我不想​​更改页面的字符集、文档类型或数据。只是在寻找可以清理字符串的utf8_decode() 类型的东西,但是utf8_encode()utf8_decode() 不起作用......

更新

对不起,“非标准字符”有点含糊,但这个错误警告也是如此。具体来说,它们不是 SGML 字符,显然不适合 SGML 解析器......但现在我进入了模糊的领域,不知道发生了什么。

【问题讨论】:

  • 究竟什么是“非标准字符”?
  • 您能准确地告诉我们“非标准”字符是什么吗? XML 中的合法字符集在这里:w3.org/TR/xml/#charsets -- 您要验证为 XHTML 吗?
  • @Ray Toal - 它们是 HeidiSQL 的换行符。错误说:“非 SGML 字符号 30”。最初,它们是文本区域中的换行符,被发送到 HeidiSQL 并存储。当从 HeidiSQL 返回值作为奇怪的换行符时,问题就开始了。
  • 编辑了我的答案以显示如何处理该字符 (U+001E)

标签: php character-encoding validation xhtml-1.0-strict sgml


【解决方案1】:

如果您所说的非标准字符是指 XHTML 验证器在您的文档中看到 XML 规范不允许的字符,即此处:http://www.w3.org/TR/xml/#charsets,那么您的解决方案是使用 XML 实体来转义它们。例如,如果你有非法字符 U+0004,那么你可以在写出来之前在 PHP 中把它变成

如果您所说的非标准字符是指您的字节序列被严重破坏以至于它不是 UTF-8 的合法字节序列(即无法解码),那么您的应用程序中存在逻辑错误。也许您正在读取字节而不是要求 PHP 读取字符并正确编码。

编辑:作为对上述关于非法字符为 30 的评论的回应,这确实是 XML 和 XHTML 中的非法字符。如果您打算将它们作为换行符,请执行 php 正则表达式替换以将 \x1E 替换为 \n

【讨论】:

  • 酷豆人!谢谢,这是一个很好的解释,并且解决方案有效。先生,你来之不易的 25 代表。
  • 对于任何其他 HeidiSQL 用户,对我有用的特定代码行是 preg_replace('/\x1E/','',$str),因为换行符也被发送。
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2012-04-28
  • 2012-04-01
  • 2011-04-28
相关资源
最近更新 更多