查找并替换多个文件

时间:2010-10-20 23:25:02

标签: php

好的,在php中最好的解决方案是搜索一堆文件内容以获取某个字符串并将其替换为其他字符串。

正如记事本++如何做到这一点,但显然我不需要接口。

2 个答案:

答案 0 :(得分:23)

foreach (glob("path/to/files/*.txt") as $filename)
{
    $file = file_get_contents($filename);
    file_put_contents($filename, preg_replace("/regexhere/","replacement",$file));
}

答案 1 :(得分:2)

所以我最近遇到了一个问题,我们的Web主机从PHP 5.2转换为5.3,并且在此过程中它破坏了我们的Magento安装。我做了一些建议的个别调整,但发现仍有一些破碎的区域。我意识到大多数问题都与Magento中存在的“toString”函数以及现在已弃用的PHP拆分函数有关。看到这个,我决定尝试创建一些代码来查找和替换所有破坏函数的各种实例。我成功地创造了这个功能,但不幸的是枪击法没有奏效。之后我还有错误。也就是说,我觉得代码有很大的潜力,我想发布我想出的内容。

但请谨慎使用。我建议您翻录一份文件,以便在遇到任何问题时可以从备份中恢复。

此外,您不一定要按原样使用它。我提供代码作为示例。您可能想要更改替换内容。

代码的工作方式是它可以找到并替换它放在文件夹中和子文件夹中的任何内容。我对它进行了调整,以便它只查找扩展名为PHP的文件,但您可以根据需要进行更改。在搜索时,它将列出它更改的文件。要使用此代码,请将其另存为“ChangePHPText.php”并将该文件上载到需要进行更改的位置。然后,您可以通过加载与该名称关联的页面来运行它。例如,mywebsite.com \ ChangePHPText.php。

    <?php
    ## Function toString to invoke and split to explode

    function FixPHPText( $dir = "./" ){
       $d = new RecursiveDirectoryIterator( $dir );
       foreach( new RecursiveIteratorIterator( $d, 1 ) as $path ){  
          if( is_file( $path ) && substr($path, -3)=='php' && substr($path, -17) != 'ChangePHPText.php'){ 
              $orig_file = file_get_contents($path);
              $new_file = str_replace("toString(", "invoke(",$orig_file);
              $new_file = str_replace(" split(", " preg_split(",$new_file);
              $new_file = str_replace("(split(", "(preg_split(",$new_file);
              if($orig_file != $new_file){
                file_put_contents($path, $new_file);
                echo "$path updated<br/>";
              }
          }
      }
    }

    echo "----------------------- PHP Text Fix START -------------------------<br/>";
    $start = (float) array_sum(explode(' ',microtime()));
    echo "<br/>*************** Updating PHP Files ***************<br/>";
    echo "Changing all PHP containing toString to invoke and split to explode<br/>";
    FixPHPText( "." );

    $end = (float) array_sum(explode(' ',microtime()));
    echo "<br/>------------------- PHP Text Fix COMPLETED in:". sprintf("%.4f", ($end-$start))." seconds ------------------<br/>";
    ?>