> 小邪最近因为流量紧缺启用了防盗链系统来着,所以为了保证防盗警示图片的大小正常。
> 只好把所有图片的 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('<','<',$value); $value_echo = str_ireplace('>','>',$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('<','<',$result); $result_echo = str_ireplace('>','>',$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 之类的东东读取数据库的数据。
> 得到的都是预处理前的数据,灰常奇妙 (*^__^*) 嘻嘻。
有点深奥啊
@疾风,
哇 是沙发 呵呵呵~
@疾风,
嘿嘿,又大又软的沙发被你坐了呦 ~
@疾风,
呵呵,小邪在逐步深入 ~ (^o^)
看不懂
@阿吴,
o(╯□╰)o,呵呵,慢慢来 ~
正则表达式以前看时觉得很怪异,不过很强的。。。
@ShuaiGe.Me,
恩恩,小邪第一次看还以为是乱码 ~ ╮(╯▽╰)╭
什么都没了 就来看看代码帝好了...
@mice,
Orz 小邪遭人围观了 ~ ╮(╯_╰)╭
没有传送门啊
@第三眼,
汗 ~ 老兄你想传到哪里去?小邪给你开一个?
想去火星吗?春哥家里也行喔 ~ O(∩_∩)O
@邪 罗刹 , 你是春哥教的成员吗
@邪 罗刹 , 对了,这个回复框中的br回车好像不能被解释。
@第三眼 , 被你发现了,小邪是护法
话说,br解释很正常呀,额,是不是你不小心清除了br?
因为小邪的后台其他童鞋的回复评论里的br都在的 ~
但是你的回复里面却看不到br额 ~
@邪 罗刹,
是这样:回复框里我可以看见br,
但是如果我把回复的文字直接写到结束符 “/>” 后面同一行的话,
就是在一行的了。回复的文字如果放在了下一行,则出来的就是下一行的。
@第三眼 , 囧,貌似真的没被解析,杯具 ~
谢谢你的提醒,小邪才发现原来br存到数据库之前就被过滤了 ~
那个,能不能麻烦你回复的时候把文字放在下一行 ~
谢谢喔,因为小邪以后如果需要做什么改动 ~
就可以批量更改了 ~
@邪 罗刹,
好,没问题。
正则表达式很难,但是很好用。
@Hailo,
恩,有几次在Editplus里看到这个功能,就有学的想法了。
反正我对这个盗链是不留意了。。不过我发现有一些跟我博客一样性质的。。
做好本分就好了。我那是属于转帖收集,但我绝对保证贴上来源 。。
基本都没有贴上来源。。我觉得还蛮厌恶的。。还要在文章里说得振振有词,出自XX博客~
@kaka,
恩,很让人讨厌的,就算在文章中写了出自哪里 ~
但是基本上那个哪里都是胡编乱造的 ~
呵呵,童鞋你原则很好哇 ~
有人上手机网给你留言吗?呵呵,我就来了,建议你强化一下这个手机网插件吧,很需要呢。
@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月份就会忙起来了 ~ 所以在那之前,小邪也想多做点事情呢 ~
@邪 罗刹,
学习为重,学习为重。
说到正则, 那肯定是Perl最强大了.
@柳城,
嘿嘿嘿,有Perl牛人开口,小邪就不担心哪个效率高的问题了 ~
以后就学Perl正则了 ~
@邪 罗刹,
呵~ PHP的正则基本上是照搬Perl的.. 大部分时候都差不别..
@柳城 , 汗 ~ 嘎嘎嘎,原来如此 ~ 小邪一下子豁然开朗,犹如重生一般,哇卡卡卡 ~
正则表达式是相当的复杂啊 但是又属于重要的基础
@smigoo,
喔,那小邪得用力专研一下 ~
这个我看不懂,支持你一下
@先看看,
呵呵,嘻嘻你的支持 ~
云里雾里,.傻眼了..
@苏扬,
囧,傻眼着傻眼着就习惯了 ╮(╯_╰)╭
很少用正则呢~~都是临时跑佛脚~~
@Jerry Chen , 嘻嘻,临时抱佛脚说明你的理解能力很快呢 ~
这个,以后吧,咱博客暂时还没到那个6G流量。
@Sawyer , 囧,呵呵,话说,小邪每次看到你的头像都会研究那么一下下 ~
应该整一个菜鸟传送门来的
最好最好整一个裸奔帝国专用通行道..
@619 , = =,您老走下水道吧 ~
@邪 罗刹,
这颗心,拔凉拔凉的 ..
@619 , 淡定 ~ 就像但丁说的一样:走自己的下水道,让别人说去吧 ~
正则表达式很灵活 不过确实教程很少 有必要好好整理下~~
不过不同的东西这个语法也不太一样~~~
就比如Emedit的语法就比较奇怪~~
@Kaisir.Wang , 恩,不知道为什么要整那么多语法出来 ~
学都学不清楚 ~
正则确实很强大。
但是貌似你的blog也没多久啊。
想一劳永逸地解决问题,是程序员的通病吧:)
@lifishake , 也是,想一劳永逸地解决问题,的确是无法抵挡的诱惑 ╮(╯_╰)╭
支持小邪,谢谢新方法的分享
@孟智 , 二和,相信你的支持~
@孟智 , 晕,打错了,谢谢你的支持喔 ~
我发现我将图片匹配的正则表达式给复杂化了。。。
@QiQiBoY , 没有,没有!你那个才是正则式用得更加好的现象 ~
正则式写的越好,就越复杂,越详细 ~
小邪碰巧看了一些高手的心得 ~
他们是先写出小邪这样的,然后慢慢详细复杂化成你那个样子 ~
为的是得到更精确的结果 ~
所以坚持你的,小邪看到你写的的时候,也明白了很多东西 ~
@QiQiBoY , ......... 额 实际上 ~ 呵呵,那个 ~
@邪 罗刹,
对于《img width="" src="" /》这种img标签和src中间还有字符的b的写法就无法匹配了吧。。。。
@QiQiBoY , 汗 = =,原来如此 ~ 小邪了解了 ~
虽然小邪没见过这样的写法,囧了 ~
又是码文好晕哈哈
不过 还是支持小邪
@sweetdrug , 陪你晕一下下 ~ 刚才小邪自个儿在那儿和数据库晕着 ~
看了几遍
还是不知这是啥...
@Auston Jary , 囧 ╮(╯▽╰)╭ ~
正则式了解一点,很长时间不用又忘得差不多了。。。
@SATURN , 汗 ~ 其实牛叉的正则式可以代替一大段程序代码呢 ~
这个正则后面那个.不是要有一个反斜杠吗?
@fatkun , = =,小邪发现里面带有分支条件的正则式两边用斜杠会出错 ~
而且网上根本找不到多少资料 ~ 所以自己一个个符号试过去 ~
发现括号可以正常运行 ~
杯具 ~
@邪 罗刹,
额。。。同情一下下。。。
@fatkun , 谢谢,嘎嘎,太悲剧鸟 ~
这好像是WP的吧,我是ZB的,所以只看ASP.
@国外网页设计教程 , 唉,杯具,虽然小邪会那么一点点ASP ~
但是还是不敢用呐 ~
因为小邪一直对ASP的安全性有点担忧 ~
得到的结论就是 人气高也不一定是好事 哈哈
@江流 , 呵呵,小邪觉得这是一个值得高兴的事情呢 ~
人气高让流量飞快减少 ~
但是如果人气不高,流量没法换来人气呐 ~
@ZhangGe , = =,淡定 ~ 习惯就好了 ~
说道正则,有一个问题请教一下
“13位长度字符,其中有8位连续数字”,我现在用的“\d{8}”无法判断13位~
@alswl , 恩,这个是要用到比较复杂的逆向判定 ~
小邪明天在新文章里会分析一下 ~
现在小邪发完文章就不在电脑前了 ~
最近老妈管的比较严 ~
所以回复用的是手机,明天小邪告诉你怎样搞定它 ~
@邪 罗刹,
谢谢,费心了
@alswl , 嘻嘻,应该的,小邪待会儿发布 ~