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