最近遇到这样一个小需求:对很多个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';

