zoukankan      html  css  js  c++  java
  • 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('【', '】', '[', ']', '「', '」', ';', "'", '"', '.', '、', '-', '?', '!', '『', '』', '《', '》', '%', '~', '$', '※', '(', ')', '(', ')', ':', ':', '〖', '#', '-', '×', '*', ' ', '”', '…', '’', '_', '■', " ");// 制表符

    $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] = '/^( )$/';//貌似也是换行符
    $pattern[8] = '/^( )$/';//换行符

    $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("/[
    ]/",'',$str);
    
        //然后按照,分隔成数组
        $arr = explode('', $str);
    
        //将数组中元素strlen大于8的依次 输出到2.txt并且添加上
    
        $arr_count = count($arr);
        if($arr_count>=1){
    
            for($i=0; $i<$arr_count; $i++){
    
                if(strlen($arr[$i])>8){
    
                    fwrite($fopen2, $arr[$i]."
    ");//必须使用双引号,
    才会被解析成换行符。 否则会直接被输出
                }
            }
        }
    }
    
        fclose($fopen1);
        fclose($fopen2);
    
    ?>
  • 相关阅读:
    perl 模拟curl 发送json数据
    perl put 发送数据
    8小时浓度均值即连续8个小时浓度的平均值
    awk 字段匹配
    rsyslog imfile配置
    EasyUI datetimebox 的onchange事件的问题
    5大领先的商业智能解决方案,国产上榜!
    5大领先的商业智能解决方案,国产上榜!
    perl post 带中文名字的文件
    Openstack 实现技术分解 (2) 虚拟机初始化工具 — Cloud-Init & metadata & userdata
  • 原文地址:https://www.cnblogs.com/qunshu/p/3139056.html
Copyright © 2011-2022 走看看