在PHP中将此十六进制字符替换为字符串

Gui*_*rmo 5 php hex replace preg-replace character-encoding

我正在从来自数据库(和一些JSON提要)的数据生成XML.

我在一些文本中遇到一些问题,这些文本包含一些破坏我的XML的十六进制字符.

例如,请参阅我从Chrome获得的错误的屏幕截图: XML错误

我发现了给我带来问题的十六进制字符(我相信它们被称为控制字符).这些是:

0x03
0x05
0x16
0x0E
Run Code Online (Sandbox Code Playgroud)

如何在我的XML输出上打印之前用PHP替换这些字符?

谢谢!

Ign*_*ams 15

不仅仅是那些角色会破坏它......

preg_replace('/[\x00-\x1f]/', '?', $s);
Run Code Online (Sandbox Code Playgroud)


hak*_*kre 5

您列出的字符确实是控制字符,全部放置在C0 集中

0x03 - ETX  End of Text
0x05 - ENQ  Enquiry
0x0E - SO   Shift Out
0x16 - SYN  Synchronous Idle
Run Code Online (Sandbox Code Playgroud)

您应该验证这些字符如何进入字符串。我真的不能建议删除它们(如果您打算删除它们,至少使用替换字符,而不仅仅是删除它们),但这里要保守一点,因为它们不是无效的 unicode,只需将它们转换为数字实体(这也在这里成功完成):

$pairs = array(
    "\x03" => "",
    "\x05" => "",
    "\x0E" => "",
    "\x16" => "",
);
$xml = strtr($xml, $pairs);
Run Code Online (Sandbox Code Playgroud)

希望这有帮助。