批量修改文章中的标签

  实在受不了syntax highlighter的速度,所以暂时去找了个wp-syntax高亮插件来代替。问题来了,我之前使用时标签都是类似:[c][/c],[php][/php]的,当时偷懒不想写完整的标签。但是wp-syntax只支持类似<pre lang=”language” line=”1″></pre>之类的标签。只好想法去修改了,但是手工修改的工作量太大,于是继续想懒办法。
  解决的方法肯定是正则表达式了。所以用php写了个,数据库就按照wp的结构来。下面是代码:

<?php
	mysql_connect("localhost" ,  "mysqlname" ,"passwd") or die("can't connect to server");
	//这句很关键,如果不设定,读取的全部是乱码,update后数据库中保存的也就成乱码了。
	mysql_query("SET NAMES 'UTF8'");
	mysql_select_db("dbname");
//修改所有文章.
	$result = mysql_query("select ID ,post_content from wp_posts");
	while ($row = mysql_fetch_array($result,MYSQL_ASSOC)){
		$rst = rp($row["post_content"]);
		$id = $row["ID"];
		$sqlupdate = "update wp_posts set post_content = '$rst' where ID = $id";
		mysql_query($sqlupdate);	
		//sleep(10);这句话如果有的话,执行时间过长。超过了30s的最大执行时间。没找到怎么取消这个时间限制。
	}
	echo "ok";
 
//下面是只修改其中一篇文章时的代码.
/*
	$result = mysql_query("select ID,post_content from wp_posts where ID=197");
	$row = mysql_fetch_row($result);
	$id = $row[0];	//ID
	$rst = rp($row[1]);//post_content
	$sqlupdate = "update wp_posts set post_content = '$rst' where ID = $id";
	mysql_query($sqlupdate);
 
	echo "ok"; 
*/
function rp($rst){ 
    $pattern = array( 
        "/\[c\](.*?)\[\/c\]/is", 
        "/\[cpp\](.*?)\[\/cpp\]/is", 
        "/\[php\](.*?)\[\/php\]/is", 
        "/\[css\](.*?)\[\/css\]/is",  
        "/\[html\](.*?)\[\/html\]/is"
    ); 
    $replace = array( 
        "<pre lang=\"c\" line=\"1\">\${1}</pre>", 
        "<pre lang=\"cpp\" line=\"1\">\${1}</pre>", 
        "<pre lang=\"php\" line=\"1\">\${1}</pre>", 
        "<pre lang=\"css\" line=\"1\">\${1}</pre>",
        "<pre lang=\"html\" line=\"1\">\${1}</pre>"
    );
    return  preg_replace($pattern,$replace,$rst); 
}
 
?>

  你看到的我现在的文章,就是用这个方法修改的。不过,遇到点小问题,有几篇竟然没有转换过去,而当我用修改单篇文章的方式修改时又可以,难道是因为我执行时间太短,还是mysql请求太频繁?
  早上4点20了,要睡了额。

  随笔:很喜欢刘未鹏大师的一幅画。

寻找什么和找到了什么

寻找什么和找到了什么

2 Comments are ready?

  1. ivan said on: 2009年08月23日 08:23

    这样会很慢吧?
    用vim或者sed都挺方便的

    boluor 回复  于   

    用vim和sed是可以的,不过那样我得一个个得把文章给拷贝,处理,再粘贴,比较麻烦。

    话说效率貌似也不慢阿,除了不知道为什么有几篇没有转过去外,其他的都是一次性的就转换好了。

  2. 万戈 said on: 2009年08月23日 17:15

    直接在数据库里替换行的不?

    boluor 回复  于   

    你是指在数据库中手工修改还是用SQL语句?如果是SQL语句的话,我不是很熟,尤其是要用正则表达式替换。手工修改就没得说啦,有几篇文章我就是用PhpMyAdmin直接修改的。