PHP 对目录下所有TXT进行遍历 并正则进行处理 preg_replace

 1 <?php

 2 

 3     set_time_limit(0);

 4 

 5     //遍历 指定目录下的所有 文件/ $pattern是要匹配的 文件规则

 6     function file_list($dir,$pattern="")  

 7     {  

 8         $arr=array();  

 9         $dir_handle=opendir($dir);  

10         if($dir_handle)  

11         {  

12             // 这里必须严格比较,因为返回的文件名可能是“0”   

13             while(($file=readdir($dir_handle))!==false)  

14             {  

15                 if($file==='.' || $file==='..')  

16                 {  

17                     continue;  

18                 }  

19                 $tmp=realpath($dir.'/'.$file);  

20                 if(is_dir($tmp))  

21                 {  

22                     $retArr=file_list($tmp,$pattern);  

23                     if(!empty($retArr))  

24                     {  

25                         $arr[]=$retArr;  

26                     }  

27                 }  

28                 else  

29                 {  

30                     if($pattern==="" || preg_match($pattern,$tmp))  

31                     {  

32                         $arr[]=$tmp;  

33                     }  

34                 }  

35             }  

36             closedir($dir_handle);  

37         }  

38         return $arr;  

39     }

40 

41     $file_arr = file_list("E:/www/zendstudio-project/test/", "/^.*\.txt$/");

42 

43     $fopen2 = fopen('test.txt', 'a');//以追加方式打开一个待写入的文件
$fopen2 = fopen('../test.txt', 'a');//以追加方式打开一个待写入的文件 上面的写法是死循环,出去半小时,回来生成一个6G的TXT文件,还在生产...
 44 45 for($i=0; $i<count($file_arr); $i++){ 46 47 $fopen1 = fopen($file_arr[$i], 'r');//以读的方式 依次 打开目录下所有文件 48 49 while(!feof($fopen1)){ 50 51 $str = fgets($fopen1); 52

$arr_serach = Array('【', '】', '[', ']', '「', '」', ';', "'", '"', '.', '、', '-', '?', '!', '『', '』', '《', '》', '%', '~', '$', '※', '(', ')', '(', ')', ':', ':', '〖', '#', '-', '×', '*', ' ', '”', '…', '’', '_', '■', "\t");//\t制表符

$str = str_replace($arr_serach, '', $str);

 
   

//书|作者|节|正版|作品|内容|a-zA-Z0-9
$pattern[0] = '/^(.*书.*)$/i';
$pattern[1] = '/^(.*作.*)$/i';
$pattern[2] = '/^(.*节.*)$/i';
$pattern[3] = '/^(.*版.*)$/i';
$pattern[4] = '/^(.*章.*)$/i';
$pattern[5] = '/^(.*内容.*)$/i';
$pattern[6] = '/^(.*[a-zA-Z0-9].*)$/i';
$pattern[7] = '/^(\r\n)$/';//貌似也是换行符
$pattern[8] = '/^(\n)$/';//换行符

$str = preg_replace($pattern, '', $str);
58     

59             fwrite($fopen2, $str);

60         }

61         

62         fclose($fopen1);

63     }

64 

65     fclose($fopen2);

66 

67 ?>

 

本次总结,str_replace 与 正则替换的顺序很重要。

1.因为考虑到str_replace替换后会有,换行符留下。  所以,正则匹配单一换行符,就得在后面.

2.因为是替换其他文件的字符串,所以要保证替换的文件的【编码】与PHP编码一致。否则,蛋疼...你会发现除了换行符意外什么都没替换。

3.遍历目录下所有文件的函数file_list有待完善,因为如果有多级目录。返回就是二级、三级数组甚至更多。(有时间完善,返回一级数组)

function array_multi2single($array) 

{ 

    static $result_array=array(); 

    foreach($array as $value) 

    { 

        if(is_array($value)) 

        { 

            array_multi2single($value); 

        } 

        else  

            $result_array[]=$value; 

    } 

    return $result_array; 

} 
//如果目录层级4,5甚至更多,极其容易内存爆掉。不推荐




//这个不错。

function array_multi2single($arr) {
#将数值第一元素作为容器,作地址赋值。
$ar_room = &$arr[key($arr)];
#第一容器不是数组进去转呀
if (!is_array($ar_room)) {
#转为成数组
$ar_room = array($ar_room);
}
#指针下移
next($arr);
#遍历
while (list($k, $v) = each($arr)) {
#是数组就递归深挖,不是就转成数组
$v = is_array($v) ? call_user_func(__FUNCTION__, $v) : array($v);
#递归合并
$ar_room = array_merge_recursive($ar_room, $v);
#释放当前下标的数组元素
unset($arr[$k]);
}
return $ar_room;
}

 

 

 

问题1.

php 正则去除英文所有标点符号

<?php

$string="hello{}[]()'发{}『』【】,world你好";

//去除英文标点符号

$string=preg_replace("/[[:punct:]]/",'',$string);

echo $string;

?>

 

 问题2:

<?php



    set_time_limit(0);





$fopen1 = fopen('1.txt', 'r');

$fopen2 = fopen('2.txt', 'a');



while(!feof($fopen1)){



    $str = fgets($fopen1);



    //去掉 换行符 <>/\ preg_replace("/[[:punct:]]/",' ',$str); 

    $str_search = array("<", ">", "\\", "/");

    $str = str_replace($str_search, '', $str);

    $str = preg_replace("/[[:punct:]]/",'',$str);

    $str = preg_replace("/[\r\n]/",'',$str);



    //然后按照,分隔成数组

    $arr = explode('', $str);



    //将数组中元素strlen大于8的依次 输出到2.txt并且添加上\r\n

    $arr_count = count($arr);

    if($arr_count>=1){



        for($i=0; $i<$arr_count; $i++){



            if(strlen($arr[$i])>8){



                fwrite($fopen2, $arr[$i]."\r\n");//必须使用双引号,\r\n才会被解析成换行符。 否则会直接被输出

            }

        }

    }

}



    fclose($fopen1);

    fclose($fopen2);



?>

 

你可能感兴趣的:(replace)