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