首先,我有一个XML文件数组。 这些文件需要循环访问并检查某些"无法识别"的十六进制字符,并用普通的UTF-8文本或某种占位符替换。
我尝试遍历文件并使用str_replace和preg_replace替换了十六进制代码,但是没有运气。 我的最终问题是,当尝试使用simpleXML打开这些文件时,我收到有关"非UTF字符"的错误。
这是我到目前为止的内容:
class HexadecimalConverter {
public $filenames = array();
public function __construct($filenames) {
$this->filenames = $filenames;
$this->removeHex();
}
public function removeHex() {
foreach ($this->filenames as $key => $value) {
$contents = file_get_contents($value);
$contents = preg_replace("/\x96/", '–', $contents);
$contents = preg_replace("/\x97/", '—', $contents);
$contents = preg_replace("/\x85/","...", $contents);
$contents = preg_replace("/\xBA/","", $contents);
file_put_contents($value, $contents);
}
}
}
这是我要修复的错误:警告:simplexml_load_file()[function.simplexml-load-file]:./04R_P455_S1157.xml:5:解析器错误:输入的UTF-8输入不正确,表示编码! 字节:行130上C: xampp htdocs hint_updater libraries hint_updater_classes.php中的0x97 0x0D 0x0A 0x69
仍然没有运气,我已经尝试了该线程中建议的所有操作,但是preg_replace似乎并没有替换所有十六进制代码实例。
我不明白。 您能否举例说明您的XML文件当前是什么样子?
无关紧要的是,xml文件的结构很好...但是人们已经掌握了一些如何将非法字符复制和粘贴到文件中的方法,从而在文件中导致不必要的十六进制代码。
XML文件可以包含4000多个数据行,因此它们是大文件。
preg_replace返回新字符串。
尝试$contents = preg_replace("/\x96/", '–', $contents);之类的。
抱歉,这是一个拼写错误...我刚刚重新插入了preg_replace。在每个preg_replace之前使用正确的$ contents =,它似乎仍然无法通过并替换这些十六进制代码的所有实例
您确定不想要foreach ($this->filenames as $value)吗?那是我认为该代码唯一的另一件事。
没关系...这只是给我索引和值
试图改变这一点……因为这是我最后的希望:)
您确定您的代码无效吗?请记住,有几种不同的方法可以产生浓重的口音...例如,具有组合的接受字符,或在已设置适当的口音的情况下键入字母。检查来自程序的十六进制输出-它可能已经删除了您指定的特殊字符。至少要解释一下它如何仍然不起作用...
当我尝试在字符串替换后使用simpleXML打开XML文件时,我得到了我的主要文章中指定的错误。
我的意思是保存替换后字符串,并检查它是否仍然包含无效字符。如果没有,那么他们不是您的问题之始。
您应该首先阅读preg_replace文档。 他们清楚地声明该函数返回修改后的字符串,因此您必须将代码中的每条preg_replace行更改为$contents = preg_replace(...);才能使替换工作。 现在,您正在执行替换操作,但会将结果字符串扔掉,因此最后将原始字符串写回到文件中。