使用preg_replace处理巨大的xml文件

时间:2015-04-19 13:55:50

标签: php xml

我试图在一个巨大的xml文件(1GB)之间进行搜索替换。 我发现这个伟大的代码在我的文件上使用str_replace时工作得很好 -

<?php 

function replace_file($path, $string, $replace)
{
    set_time_limit(0);

    if (is_file($path) === true)
    {
        $file = fopen($path, 'r');
        $temp = tempnam('./', 'tmp');

        if (is_resource($file) === true)
        {
            while (feof($file) === false)
            {
 file_put_contents($temp, str_replace($string, $replace, fgets($file)), FILE_APPEND);
            }

            fclose($file);
        }

        unlink($path);
    }

    return rename($temp, $path);
}


replace_file('myfile.xml', '<search>', '<replace>');

到目前为止一直很好,而且效果很好。

现在我将str_replace更改为preg_replace,将搜索值更改为&#39; / ^ [^] /&#39;所以代码看起来像这样 -

<?php 

    function replace_file($path, $string, $replace)
    {
        set_time_limit(0);

        if (is_file($path) === true)
        {
            $file = fopen($path, 'r');
            $temp = tempnam('./', 'tmp');

            if (is_resource($file) === true)
            {
                while (feof($file) === false)
                {
     file_put_contents($temp, preg_replace($string, $replace, fgets($file)), FILE_APPEND);
                }

                fclose($file);
            }

            unlink($path);
        }

        return rename($temp, $path);
    }


    replace_file('myfile.xml', '/[^<search>](.*)[^</search>]/', '<replace>');

我收到错误&#34; preg_replace unknown modifier&#34; &#39; d&#39;在第16行 第16行是 -

file_put_contents($temp, preg_replace($string, $replace, fgets($file)), FILE_APPEND);

1 个答案:

答案 0 :(得分:0)

PCRE中的

[]是一个字符类。使用[^<category>],您实际上与[^<>acegorty]匹配相同。你匹配的是字符(或字节),而不是单词。

无论如何,PCRE并不是最佳解决方案。使用XMLReaderXMLWriter