2010-08-10 92 views
1

因此,首先,我有一个XML文件数组。这些文件需要迭代并检查某些'无法识别'的十六进制字符,并替换为正常的UTF-8文本或某种占位符。使用php删除xml文件中的十六进制字符

我已经尝试遍历文件并使用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加载文件]:./04R_P455_S1157.xml: 5:解析器错误:输入不正确UTF-8,指示编码! Bytes:0x97 0x0D 0x0A 0x69 in C:\ xampp \ htdocs \ hint_updater \ libraries \ hint_updater_classes.php on line 130

仍然没有运气,我试过在这个线程中建议的一切,但是preg_replace没有出现替换十六进制代码的所有实例。

+1

我不明白。你能举一个你的XML文件目前的样子吗? – Artefacto 2010-08-10 13:57:22

+0

这是无关紧要的,XML文件结构很好......但人们有一些如何设法复制和粘贴非法字符到文件中,从而导致文件中不需要的十六进制代码。 – ThinkingInBits 2010-08-10 14:00:54

+0

XML文件可以是4000多行数据,因此它们是大文件。 – ThinkingInBits 2010-08-10 14:58:13

回答

0

您应该先阅读preg_replace文档。他们明确声明该函数返回修改后的字符串,因此您必须将代码中的每个preg_replace行更改为$contents = preg_replace(...);以使替换工作正常。现在你正在做替换,但将结果字符串扔掉,因此最后你将原始字符串写回到文件中。

0

preg_replace返回新的字符串。

尝试$contents = preg_replace("/\x96/", '–', $contents);等。

+0

对不起,这是一个错字...我刚刚重新插入preg_replace。如果在每个preg_replace之前使用正确的$ contents =,它似乎仍然无法通过并替换这些十六进制代码的所有实例 – ThinkingInBits 2010-08-10 14:07:26

+0

您确定不希望使用'foreach($ this-> filenames作为$ value)' ?这是我认为这个代码有错的唯一的其他东西。 – Borealid 2010-08-10 14:14:14

+0

不应该事......这只是给我的索引连同价值 – ThinkingInBits 2010-08-10 14:18:06

相关问题