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);

?>

 

posted @ 2013-06-16 16:21  群叔  阅读(843)  评论(0编辑  收藏  举报