最近遇到这样一个小需求:对很多个HTML页面(大概有一百个左右)进行修改,修改里面的评论时间。由于有一定的规律,我就想到了用PHP提供的一些方法进行批量操作。这里用到的是 正则匹配替换函数 preg_replace_callback()。
preg_replace_callback() 与 preg_replace() 很相似,相比来讲 preg_replace_callback() 函数功能更强大,可以使用回调函数对匹配内容进行替换修改。
语法: mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject )
$pattern是正则匹配语句;$callback是回调函数;$subject是要替换的内容。
下面是我的应用实例:
1.下面的这种写法,可以在php5.2版本及以上运行
$content = '<span class="list_item_time">12-12 8:59:11</span> <span class="list_item_time">11-20 12:59:11</span>'; $pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i'; $replace = array('昨天10:21:30', '昨天16:11:58'); function sks_replace($ms) { global $replace; static $i = 0; $str = $replace[$i]; $str = '<span class="list_item_time">'. $str. '</span>'; $i++; return $str; } $new = preg_replace_callback($pattern,'sks_replace',$content);
2.下面的写法,由于使用到了匿名函数,只能在php5.3以上版本可以运行
$content = '<span class="list_item_time">12-12 8:59:11</span> <span class="list_item_time">11-20 12:59:11</span>'; $pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i'; $replace = array('昨天10:21:30', '昨天16:11:58'); $new = preg_replace_callback( $pattern, function($ms) { global $replace; static $i = 0; $str = $replace[$i]; $str = '<span class="list_item_time">'. $str. '</span>'; $i++; return $str; }, $content);
3.以上两种是简单的匹配一个内容 $content,如果有多个内容需要循环匹配替换,就需要代码更复杂一些
以下代码是实现目录结构为下图内容的循环替换
$pro = array('kqky_x', 'nrkc', 'yjs_x', 'yzy', 'pz'); function sks_replace($ms) { //注意这里不能再用静态变量对$j循环了,而是用全局变量 global $replace, $j; $str = $replace[$j]; $str = '<span class="list_item_time">'. $str. '</span>'; $j++; return $str; } foreach($pro as $p) { $file = './'. $p. '.txt'; if (!is_file($file)){ echo 'not open '. $file. '<br>'; continue; } $replace = file($file); foreach($replace as &$value){ $value = mb_convert_encoding($value, 'utf-8', 'gbk'); } $k = 9; for($i = 0; $i < $k; $i++) { if ($i == 0){ $i = ''; } $html = '../skswenda'. $i. '/'. $p. '/index.html'; if ($p == 'pz'){ $html = '../skswenda/pz'. $i. '/index.html'; $k = 7; } if (!is_file($html)){ echo 'not open '. $html. '<br>'; continue; } $content = file_get_contents($html); $pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i'; $j = 0; $new = preg_replace_callback($pattern,'sks_replace',$content); $handle = fopen($html, 'w'); fwrite($handle, $new); fclose($handle); } } echo 'replace success';