PHP:html_entity_decode删除/不显示字符

时间:2012-04-12 17:28:12

标签: php utf-8 html-entities html-encode

我的网站上的字符有问题。

我有一个网站,用户可以使用wysiwyg编辑器(ckeditor)来填写他们的个人资料。在放入数据库之前,内容通过htmlpurify运行(出于安全原因)。

数据库的所有表都设置了UTF-8字符集。我还在脚本执行开始时调用'SET NAMES utf-8'以防止出现问题(这些问题已经存在多年,因为我很长时间没有遇到过这个问题)。显示文本的网页的内容类型为utf-8,我也使用header()函数来设置内容类型和字符集。

当我尝试在内容上运行正则表达式时,显示文本似乎都很好。 html_entity_decode(使用'utf-8'的编码参数调用)由于某种原因删除/不显示Â字符,它留下了导致我的所有正则表达式失败的东西(似乎那里有一个字符,但我不能在源中查看。)

如何阻止和/或删除此字符,以便运行正则表达式?

编辑:我已经决定放弃ckeditor,并使用此网站使用的降价格式,以获得更大的灵活性。只要我记得,我一直讨厌所见即所得的编辑。将所有配置文件更新为新格式将使我有机会删除所有违规文本并为网站提供一个干净的开始。感谢您的所有投入。

2 个答案:

答案 0 :(得分:1)

你可能面临的情况是字符串实际上没有正确的UTF-8编码(正如你所写的那样,但事实并非如此)。然后,html_entity_decode可能会删除带有替换字符的任何无效的UTF-8字节序列(例如Â的单字节字符集编码)。

根据您使用的PHP版本,您可以通过使用标志来更好地控制如何处理这个问题。

此外,要找到您看不到的字符,请创建hexdump of the string

答案 1 :(得分:1)

由于你所谈论的角色存在于ANSI字符集中,你可以这样做:

utf8_encode( preg_replace($match, $replace, utf8_decode($utf8_text));

但是这会破坏ANSI字符集中不存在的任何unicode字符。为避免这种情况,您始终可以尝试使用具有多字节(unicode)支持的mb_ereg_replace

string mb_ereg_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )