PHP使用preg_replace_callback函数实现文件内容的批量更换

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

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇