使用正则式整理数据库中IMG标签

> 小邪最近因为流量紧缺启用了防盗链系统来着,所以为了保证防盗警示图片的大小正常。
> 只好把所有图片的 IMG 标签中除了 SRC 指向图片的 URL 属性以外,其他全部清除。

> 因为国内网上的正则式教程十分紧缺,只能找到少量的教程,有时候很难学习全面。
> 所以小邪也只能按照自己多次的测试得出的结果来稍微讲解一下呢,能学多少就看你的咯。

一. 有关正则式的函数分类:

> 正则表达式函数库(Perl 兼容)-

> preg_grep -- 返回与模式匹配的数组单元
> preg_match_all -- 进行全局正则表达式匹配
> preg_match -- 进行正则表达式匹配
> preg_quote -- 转义正则表达式字符
> preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换
> preg_replace -- 执行正则表达式的搜索和替换
> preg_split -- 用正则表达式分割字符串

> 正则表达式函数库(POSIX 扩展)-

> ereg_replace -- 替换正则表达式
> ereg -- 正则表达式匹配
> eregi_replace -- 不区分大小写替换正则表达式
> eregi -- 不区分大小写的正则表达式匹配
> split -- 用正则表达式将字符串分割到数组中
> spliti -- 用正则表达式不区分大小写将字符串分割到数组中
> sql_regcase -- 产生用于不区分大小的匹配的正则表达式

> 这两组函数库提供了对 POSIX 和 PERL 两种风格的正则表达式的支持。
> 区别不大,PERL 的表达式两边要加上 “/”,而且据说 PERL 运行效率高一点。

二. 程序运行LOG日志记录:

> 呵呵,这个是程序运行的时候会陆续输出的运行记录,方便检查。
> 第一次运行的时候像下面这样,然后刷新,被替换和替换为的数据会变成相同的。
> 这样就表示替换成功了,恭喜发财,嘿嘿嘿 O(∩_∩)O。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Post Id => 1864
//正在被替换的数据库中文章的ID
<img src="http://www.evlos.org/uploads/1451_020.jpg"
 class="alignnone" width="600" height="437" />
//在数据库中的文章表里面查找到的IMG标签
<img src="http://www.evlos.org/uploads/1451_020.jpg" />
//将要被替换成为的精简过的IMG标签
ID Count : 1
//此文章中的图片数量统计
Success ~!
//成功更新了Mysql数据库中的数据
 
Post Id => 1875
<img src="http://www.evlos.org/uploads/1451_031.jpg"
 class="alignnone" width="600" height="235" />
<img src="http://www.evlos.org/uploads/1451_031.jpg" />
<img src="http://www.evlos.org/uploads/1451_030.jpg"
 class="alignnone" width="600" height="156" />
<img src="http://www.evlos.org/uploads/1451_030.jpg" />
<img src="http://www.evlos.org/uploads/1451_031.jpg"
 class="alignnone" width="600" height="235" />
<img src="http://www.evlos.org/uploads/1451_031.jpg" />
<img src="http://www.evlos.org/uploads/1451_028.jpg"
 class="alignnone" width="600" height="186" />
<img src="http://www.evlos.org/uploads/1451_028.jpg" />
<img src="http://www.evlos.org/uploads/1451_029.jpg"
 class="alignnone" width="600" height="246" />
<img src="http://www.evlos.org/uploads/1451_029.jpg" />
ID Count : 5
Success ~!
 
-------------------
Count : 296 //整个WP_posts表中,所有的的图片总数

三. 程序源代码:

> 以下内容保存为任意名称的 PHP 文件,填好配置,运行即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
$sqlc_host = "localhost"; //Mysql服务器地址
$sqlc_user = ""; //用户名
$sqlc_psw = ""; //密码
$sqlc_dba = "wordpress"; //数据库名
echo '<html><head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Img标签批量清洗程序</title>
</head><body>';
$img_count = 0;
$sqlc_con = mysql_connect($sqlc_host,$sqlc_user,$sqlc_psw);
mysql_select_db($sqlc_dba,$sqlc_con);
mysql_query("set names UTF8");
$sqlc_inner = mysql_query("SELECT * FROM wp_posts");
while($sqlc_row = mysql_fetch_array($sqlc_inner)) {
	$cid = $sqlc_row['ID'];
	echo "<br />\n".'Post Id => '.$cid."<br />\n";
	$img_change = $sqlc_row['post_content'];
	$img_preg = '/<img src=[^>]+>/';
	preg_match_all($img_preg,$img_change,$img_find);
	$img_count_id = $img_count;
	foreach ($img_find[0] as $value) {
		$img_count++;
		$value_echo = str_ireplace('<','&lt;',$value);
		$value_echo = str_ireplace('>','&gt;',$value_echo);
		echo $value_echo."<br/>\n";
		preg_match("(http://.+\.(jpg|png|JPG|PNG))",$value,$img_url);
		if (isset($img_url[0])) {
			$result = '<img src="'.$img_url[0].'" />';
		}
		else {
			$result = '';
		}
		$result_echo = str_ireplace('<','&lt;',$result);
		$result_echo = str_ireplace('>','&gt;',$result_echo);
		echo $result_echo."<br/>\n";
		str_ireplace("\n","",$value);
		if ($result <> '<img src="" />'&&$cid <> 1887&&$result <> '') {
			$img_change = str_ireplace($value,$result,$img_change);
		}
	}
	echo 'ID Count : '.($img_count - $img_count_id)."<br/>\n";
	$img_change = addslashes($img_change);
	$change = $img_change;
	if (mysql_query("update wp_posts set post_content='".$change."' where id=".$cid."")) {
		echo 'Success ~!';
	}
	else {
		echo "Error : " . mysql_error();
	}
}
echo '<br/>-------------------<br/>Count : '.$img_count;
echo '</body></html>';
mysql_close($sqlc_con);
?>

四. 程序运行原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql_query("set names UTF8");
//这里将数据库查询时候的字符集设定为 UTF-8,否则得到的数据会是乱码
 
$img_preg = '/<img src=[^>]+>/';
preg_match_all($img_preg,$img_change,$img_find);
//这里使用正则式将 IMG 标签全部找出来,并把整个标签放到 $img_find 变量里
 
preg_match("(http://.+.(jpg|png))",$value,$img_url);
//这里把 IMG 标签之中的 URL 提取出来
 
$result = '<img src="'.$img_url[0].'" />';
if ($result <> '<img src="" />') {
	$img_change = str_ireplace($value,$result,$img_change);
}
//这里把提取之后重新组合的 IMG 标签替换进去
 
$img_change = addslashes($img_change);
//小邪觉得这个是亮点,这个函数能够让我们把 HTML 代码顺利存储到数据库

五. 程序中使用过的正则式:

1
$img_preg = "/<img src=[^>]+>/";

> 找到以首先找到 IMG 标签的头部,然后后面的中括号里是一个条件。
> 条件表达的是,这里跟着的字符是除了右尖括号以外的字符。
> 右中括号的后边是个加号,意思是 “重复一次或更多次”。
> 最后以右尖括号作为结尾,这样子就可以捕捉 IMG 标签咯。

1
$img_url_preg = "(http://.+.(jpg|png))"

> 首先这里两边要用括号,表示包含分枝条件。然后找到以 HTTP:// 开头的字符。
> 接着用 “.” 表示 “匹配除换行符以外的任意字符”,然后用加号标示重复次数。
> 加一个斜杠标示转义字符,就是说后面那个点是普通字符,不是正则式的内容。
> 然后加个括号,里面是分枝条件,标示最后是以 jpg 或者 png 结尾的。

六. 常用的正则式语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.	匹配除换行符以外的任意字符
w	匹配字母或数字或下划线或汉字
s	匹配任意的空白符
d	匹配数字
	匹配单词的开始或结束
^	匹配字符串的开始
$	匹配字符串的结束
 
*	重复零次或更多次
+	重复一次或更多次
?	重复零次或一次
{n}	重复n次
{n,}	重复n次或更多次
{n,m}	重复n到m次
 
W	匹配任意不是字母,数字,下划线,汉字的字符
S	匹配任意不是空白符的字符
D	匹配任意非数字的字符
B	匹配不是单词开头或结束的位置
[^x]	匹配除了x以外的任意字符
[^aeiou]	匹配除了aeiou这几个字母以外的任意字符
 
*?	重复任意次,但尽可能少重复
+?	重复1次或更多次,但尽可能少重复
??	重复0次或1次,但尽可能少重复
{n,m}?	重复n到m次,但尽可能少重复
{n,}?	重复n次以上,但尽可能少重复

七. Addslashes 预处理函数:

1
2
3
4
5
<?php
$a = "img src="'1''2'20100101/18/59_006.jpg" /";
echo addslashes($a);
?>
//输出 img src=\"\'1\'\'2\'20100101/18/59_006.jpg\" /

> 预处理之后的样子在上面代码框中,这样存储就不会出现错误了。
> 而使用 Phpmyadmin 或者 mysql_query 之类的东东读取数据库的数据。
> 得到的都是预处理前的数据,灰常奇妙 (*^__^*) 嘻嘻。

Leave a comment

82 Comments.

  1. 疾风 坐沙发!#1

    有点深奥啊

  2. 阿吴 坐板凳!#2

    看不懂

  3. ShuaiGe.Me 躺地板!#3

    正则表达式以前看时觉得很怪异,不过很强的。。。

  4. mice 天花板!#4

    什么都没了 就来看看代码帝好了...

  5. 第三眼 下水道!#5

    没有传送门啊 :cool:

  6. 正则表达式很难,但是很好用。 :lol:

  7. 反正我对这个盗链是不留意了。。不过我发现有一些跟我博客一样性质的。。
    基本都没有贴上来源。。我觉得还蛮厌恶的。。还要在文章里说得振振有词,出自XX博客~
    :mad: 做好本分就好了。我那是属于转帖收集,但我绝对保证贴上来源 。。

    • @kaka,
      恩,很让人讨厌的,就算在文章中写了出自哪里 ~
      但是基本上那个哪里都是胡编乱造的 ~
      呵呵,童鞋你原则很好哇 ~

  8. 有人上手机网给你留言吗?呵呵,我就来了,建议你强化一下这个手机网插件吧,很需要呢。

    • @rusaer,
      额,从哪里着手呢,小邪觉得现在蛮好的说 ~
      Wap.evlos.org ~

      • @邪 罗刹,
        那我提提啊。
        1,评论不能进行回复。
        2,新闻续写的时候会自动关闭评论,返回编辑又是乱码。--这个不知道你有没有遇到,我是遇到了。
        3,手机rss的订阅。
        4,继续想。。。呵呵

        因为我比较喜欢用手机看网站,所以,,,很需要

    • @rusaer , 囧,强化插件?汗,刚才小邪没看清楚来着 ~
      话说,小邪的手机插件的评论是可以回复的呀 ~
      第二条也没遇到过呢 ~
      汗 = =,手机RSS?是在插件里面加个RSS链接吗?这个倒是简单 ~

      • @邪 罗刹,
        评论可以回复?通过@某某来回复?我的就不能。
        rss是要连接到wap文章。就是点击连接不是网站的文章。今天折腾了一个下午没出来。
        能不能整个整理一个wap网站列表,有更新的wap网站特别显示?

    • @rusaer , 额,@某某的评论,原来如此,小邪的也是不行的呢 ~
      话说小邪对RSS的输出现在还是十窍通了九窍 ~
      所以小邪暂时帮不上什么忙呢 ~
      话说你说的rss是哪里的rss?
      是博客生产的rss吗?如果这里指向wap ~
      那别人的阅读器打开的时候不就杯具了?
      还是另外再生成个rss?
      唔,小邪倒是可以帮你,先读取原先的RSS,转换成带手机连接的rss ~
      不过得等双休日了,因为现在每天的时间不够小邪把rss的格式搞懂的 ~
      你提的wap网站列表倒是挺有新意的 ~
      不过这个需要经常性地去抓取RSS ~
      唔,这个也需要搞懂格式,所以小邪双休日帮你试试看吧 ~
      如果搞定了,小邪会立马给你用的 ~

    • @rusaer , 嘻嘻,小邪现在的状态是冲刺英语中,双休日还是有点时间的 ~
      不过2月份就会忙起来了 ~ 所以在那之前,小邪也想多做点事情呢 ~

  9. 说到正则, 那肯定是Perl最强大了. :biggrin:

  10. 正则表达式是相当的复杂啊 但是又属于重要的基础

  11. 这个我看不懂,支持你一下

  12. 云里雾里,.傻眼了..

  13. 很少用正则呢~~都是临时跑佛脚~~ :mrgreen:

  14. 这个,以后吧,咱博客暂时还没到那个6G流量。

  15. 应该整一个菜鸟传送门来的 :biggrin:
    最好最好整一个裸奔帝国专用通行道.. :cool:

  16. 正则表达式很灵活 不过确实教程很少 有必要好好整理下~~
    不过不同的东西这个语法也不太一样~~~
    就比如Emedit的语法就比较奇怪~~

  17. 正则确实很强大。
    但是貌似你的blog也没多久啊。
    想一劳永逸地解决问题,是程序员的通病吧:)

  18. 支持小邪,谢谢新方法的分享

  19. 我发现我将图片匹配的正则表达式给复杂化了。。。

    • @QiQiBoY , 没有,没有!你那个才是正则式用得更加好的现象 ~
      正则式写的越好,就越复杂,越详细 ~
      小邪碰巧看了一些高手的心得 ~
      他们是先写出小邪这样的,然后慢慢详细复杂化成你那个样子 ~
      为的是得到更精确的结果 ~
      所以坚持你的,小邪看到你写的的时候,也明白了很多东西 ~ :biggrin:

    • @QiQiBoY , ......... 额 实际上 ~ 呵呵,那个 ~

      1
      2
      3
      4
      
      a = '/<img.+src=/<img.+src=[^>]+>/i';
      //这一个和下面这个没有差别
      b = '/<img src=[^>]+>/i';
      //不过小邪相信你下次会写的更好的 O(∩_∩)O
    • @QiQiBoY , 汗 = =,原来如此 ~ 小邪了解了 ~
      虽然小邪没见过这样的写法,囧了 ~

  20. 又是码文好晕哈哈
    :sad: 不过 还是支持小邪 :arrow:

  21. 看了几遍
    还是不知这是啥...

  22. 正则式了解一点,很长时间不用又忘得差不多了。。。

  23. $img_url_preg = "(http://.+.(jpg|png))"

    这个正则后面那个.不是要有一个反斜杠吗?

    $img_url_preg = "(http://.+\.(jpg|png))"
  24. 这好像是WP的吧,我是ZB的,所以只看ASP.

  25. 得到的结论就是 人气高也不一定是好事 哈哈

    • @江流 , 呵呵,小邪觉得这是一个值得高兴的事情呢 ~
      人气高让流量飞快减少 ~
      但是如果人气不高,流量没法换来人气呐 ~ :surprised:

  26. :mad: 完全看不懂!

  27. 说道正则,有一个问题请教一下
    “13位长度字符,其中有8位连续数字”,我现在用的“\d{8}”无法判断13位~

Leave a Reply

:evil: :razz: :wink: :rolleyes: :redface: :cry: :biggrin: :lol: :idea: :mrgreen: :mad: :exclaim: more »

[ Ctrl + Enter ]

Trackbacks and Pingbacks: