搜索和替换目录中的文件

时间:2016-06-09 14:54:52

标签: php regex server directory preg-replace

<span class="itemopener">82 top</span>&nbsp;<span class="allopener">all</span>

如何更改以上内容:

<span class="itemopener">top</span>&nbsp;<span class="allopener">82</span>

在html文件上使用PHP,其中包含大约30个HTML片段。

注意:82可以是大于1的任何整数。

此外,我想从一个新文件中运行此脚本,该文件放在一个目录中,该目录将运行搜索并替换该目录中的每个8000 HTML文件一次(脚本不能超时)完成 - 也许是一些反馈。)

2 个答案:

答案 0 :(得分:2)

我写了替换行的函数:

 function replace($row){
    $replaced = preg_replace_callback("~(\<span class=\"itemopener\"\>)(\d{1,5})\s(top\</span\>.*\<span class=\"allopener\"\>).{3}(\</span\>)~iU", function($matches){
    $str = $matches[1] . $matches[3] . $matches[2] . $matches[4];
    return $str;
    }, $row);
    return $replaced;
 }

$s = '<span class="itemopener">82 top</span>&nbsp;<span class="allopener">all</span>';
$replaced = replace($s);

echo "<pre>" . print_r($replaced, 1) . "</pre>";
exit();

Working demo of the function

如果你要将文件排成一行,并做一些简单的检查是否有你想要替换的跨度,那么你可以将它们发送到这个函数中。 但是,根据您指定的文件数量,需要一些时间。

要扫描路径中的所有文件,您可以在那里使用我的答案:scandir 经过少量编辑后,您可以将其修改为只读.htm文件,并返回您想要的结构..

然后你拿走所有扫描的htm文件并用这样的方法处理它们:

$allScannedFiles = array("......");
foreach($allScannedFiles as $key => $path){
    $file = file_get_contents($path);
    $lines = explode(PHP_EOL, $file);
    $modifiedFile = "";
    foreach($lines as $line){
        if(strpos($line, "span") && strpos($line, "itemopener")){
             $line = replace($line);
        }
        $modifiedFile .= $line . PHP_EOL;
    }
    file_put_contents($path, $modifiedFile);
}

我从头部写了这个片段,因此需要进行一些测试.. 然后运行它,去做自己的咖啡,等待:) 如果它会超时,你可以增加php超时。如何做到这一点在这里被问及并回答:how to increase timeout in php

或者您可以尝试将文件作为DOMDocument加载,并在该类documentation of DomDocument上进行替换 但如果在某个地方的文件中无效的html,可能会导致问题..

答案 1 :(得分:1)

我正在使用由@Jimmmy创建的函数(由d{2}替换范围d{1,5},因为“注意:82可以是大于1的任何整数”)并添加了文件搜索(测试并运行很棒):

<?php

function replace($row){
    $replaced = preg_replace_callback("~(\<span class=\"itemopener\"\>)(\d{1,5})\s(top\</span\>.*\<span class=\"allopener\"\>).{3}(\</span\>)~iU", function($matches){
        $str = $matches[1] . $matches[3] . $matches[2] . $matches[4];
        return $str;
    }, $row);
    return $replaced;
}

foreach ( glob( "*.html" ) as $file )         // GET ALL HTML FILES IN DIRECTORY.
{ $lines = file( $file );                     // GET WHOLE FILE AS ARRAY OF STRINGS.
  for ( $i = 0; $i < count( $lines ); $i++ )  // CHECK ALL LINES IN ARRAY.
    $lines[ $i ] = replace( $lines[ $i ] );   // REPLACE PATTERN IF FOUND.
  file_put_contents( $file,$lines );          // SAVE ALL ARRAY IN FILE.
}
?>