2010-11
24

小谈php正则提取图片地址

By xrspook @ 22:34:32 归类于: 烂日记

迷上了正则,不断尝试着新花招,首先感谢TNA的非完全输出RSS,然后再次感谢SH的强迫性学习。没有TNA,我不会去看正则,更不知道世界上有种这么牛的表达式;不是SH的死活说他不懂不知道,我也不会硬着头皮去琢磨,去改进。达到同一个目的,正则的表达方式可以不唯一,没有做不到,只有你没想到。可以这样说吧,正则就是玩设定规律,我大爱这种东西。没有比设定规律筛选东西更让我兴奋、感到awesome的了。

分享一下在php环境下使用正则提取图片地址的一些小心得:

图片网址规范的html代码无非就是

<img style="囧1" title="囧2" src="囧3" alt="囧4" width="囧5" height="囧6" />

囧1和囧2是非必需的,若要通过XHTML认证囧4、囧5、囧6必不可少,囧3是核心内容,当然就不能少了。

就正则谈正则的话,我写出的最短匹配是

(?<=img.+?src=”).*?(?=”)

不过,这条在php里不行,会出现:

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***

纠结了很久,都不行,原因何在呢?试了很多次,终于发现问题在(?<=img.+?src=”)这个零宽断言里,在php中,零宽断言里不支持类似“*”、“+”这些无限次的东西,于是报错了,把“.+?”改为定长就好。不过,要“img”和“src=”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。

所以

(?<=img.src=”).*?(?=”)

(?<=img\ssrc=”).*?(?=”)

可能可以,但不保证100%没问题。

你也许会问,单纯

(?<=src=”).*?(?=”)

不行吗?通常情况,可以,但,搜索过页面的盆友应该知道,除了图片地址用src开头以外,javascript地址也用src开头!而且,太多神通广大的不可预知因素隐含其中,于是这个貌似很简短完美的写法就行不通了。

你又或许会问,聪明简短的不行,我把图片的后缀列出来,总该可以了吧,如

(?<=src=”).*?\.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)

的确,这个写法实在是很老实,不过,你见过没有后缀的图片?wwe.com有很多这种例子呢

RAW http://us.wwe.com/content/media/images/Headers/15559182
SmackDown http://us.wwe.com/content/media/images/Headers/15854138
NXT http://us.wwe.com/content/media/images/Headers/15929136
Superstars http://us.wwe.com/content/media/images/Headers/15815850

上面的网址都是图片,但都没有传统后缀,你老实也没用,还是不能获取到它们。

怎么办呢?还可以这样

<img(.*?)src=”(.*?)(?=”)

和上面的表达式不同,这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。为什么呢?因为我们用了2个(.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。个人感觉还是不错的,呵呵。当然了,如果你还有更好的建议,请马上留言,全球人民都会感谢你!

你到底要什么样的图片,是固定格式还是其它?得具体情况具体分析呢。

我的建议是:

如果你要的图片地址的格式是img空格src=的,请使用:(?<=img.src=”).*?(?=”),数组唯一,你懂的。

否则,请使用<img(.*?)src=”(.*?)(?=”),记得留意有用内容所在的数组位置哦!

2010-11
19

略懂正则后

By xrspook @ 23:59:55 归类于: 烂日记

花费了好几个小时学习正则表达式(Regular Expression),简称regex。非常非常强大的一个程序员利器,在此,再次感谢SH童鞋的强迫性学习。在多种程序语言里正则都通用,用简单的符号却能组合出任何你需要的结果。看着那堆“\/#$&*^()_+|{}<>?=.”等实在会把人弄疯掉,再加上26个英文字母的大小写组合,宇宙就能编出来!这让我想起了大学时期老师教的文献检索,在说到英文数据库的时候就是这般*来?去的,但和相比,英文数据库的搜索方法只是个非常非常的简化版的正则,小儿科而已。

简单看了几个正则教程,最终觉得还是要自己打开个正则测试工具(如Windows下的Regex Tester)实操。

经过还不算太辛苦的挣扎,对TNA而言,我要提取的信息可以用以下正则实现:

(?<=href=”).*\.jpg.php

说明:“(?<=囧)”,定位在囧后;“href=””,一个字符串,也就相当于囧;“.*”,别以为“.”是连接符“*”是任意字符,恰恰相反,“.”代表除换行符以外的任意字符,“*”代表前面的东西,也就是除换行符以外的任意字符可以重复零次或更多次;“\.”,其实就代表了“.”,在正则里,“.”必须用“\”转义;“jpg.php”我的原意是一个字符串,但在正则里,看来“.”也不会被看作“.”,而代表一个除换行符以外的任意字符,也无伤大雅,毕竟我希望的“.”也在正则“.”包含的范围内。

除了用上面的“(?<=href=”).*\.jpg.php”以外,还能把正则改写为:

(?<=href=”).*\.jpg\.php /*把“.”全部正确转义,不打擦边球*/
(?<=href=”).*\b.jpg.php\b /*把“.jpg.php”看作一个单词,很自然地把其中的“.”一般字符化了,“\b”用于匹配单词的开始或结束*/

具体在YARK的正则是这般写的

preg_match_all('/(?< =href=").*\.jpg.php/', $data, $log);
囧囧囧囧
for($i=0;$i<count($log[0]);$i++) 
{  	
	<?php echo '囧'.$log[0][$i].'囧' ?>			
}

说明:由于我的正则表达式里只有一个未知数,也就是“.*”折腾出来的内容,所以,正则结果在新建的$log将是一个二维数组,具体内容将在[0][囧]里显示。如果,正则里有多个未知数,未知数就会分别出现在[0][囧0]、[1][囧1]、[2][囧2]等等里面了。得打一套“组合拳”才能把它们拼凑在一起。

正则搞定了,YARK的TNA瓶颈当然就没问题了啦!

******************* YARK专栏 *******************
2010-11-19
update
* 改进TNA功能,不再依赖页面提供的rss而是自编正则表达式,提取页面信息,再分析出图片地址
bug
* 暂无新发现
plan
* 留个门,对付任何规则资源(正则是强大的,就看你怎么用了)
******************* YARK专栏 *******************

自觉通过自学又提升一个矮矮的层次了。

2010-11
16

激情与神经病

By xrspook @ 23:30:47 归类于: 烂日记

昨天19977里有人提出图片区可否增加TNA的官图,其实如果TNA不是BT的话,贴与不贴只是个习惯的问题,但是TNA的图片很BT,右键还不能保存的那种。

首先Photo Galleries使用的是近似框架形式的大概js手段,按链接是看不到网址改变的,不过,我的癖好是“在新标签页中打开”,打开后,网址又见变化了。这是第一个手段,算是很一般。

然后,重头戏,TNA的图片全部采用.php保护,所有图片的格式都被强制变成了***.jpg.php,Firefox下右键还不能保存到图片,保护严密。还记得之前2次PPV都把我害得几近手抽筋。

TNA的图片页面很是邪恶,但它给出了订阅按钮,也就是说页面是标准rss化的。rss意味着什么?rss就意味着XML,而且它的rss还是全部输出的类型,一页的rss就能输出整个系列的全部内容。刚刚熟悉了XML的格式化和信息提取,再次让我碰上新朋友,无比的兴奋。经过不太折腾的尝试后,也居然把从前的大敌TNA的图片给扯下马来了。内牛满面。

再次炫耀一下(WWE + TNA):http://xyark.serw5.com/

今天发现20101115RAW某些页面居然无法输出,研究了一个晚上,SH最后终于得出结论!title信息里有个“&”,格式化XML时受阻,因为“&”这东西太敏感了,是不允许当作“and”的意思出现的,所以会出现输出中断。解决办法如下:

/*$data = str_replace(“\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\r\n\r\n\t\r\n\r\n\r\n\t\r\n\r\n\r\n\r\n< ?xml version=\”1.0\” encoding=\”UTF-8\”?>”, “< ?xml version=\”1.0\” encoding=\”UTF-8\”?>”, $data); 注:第一个版本的YARK是不是很笨,呵呵呵*/
$data = str_replace(“\r\n”, “”, $data);
$data = str_replace(“\t”, “”, $data);
$data = str_replace(“&”, “&amp;”, $data);
// $data = str_replace(“&”, “囧”, $data); 注:对付“&”的一个“好”方法,先囧来
$data = XML_unserialize($data);
// $data = str_replace(“囧”, “&”, $data); 注:对付“&”的一个“好”方法,再囧去

感觉自己处于见人杀人,见鬼抓鬼的状态。这就是激情了,不过正因为这些变态的激情,让我神经病了。昨晚凌晨1点多才上床睡觉,还兴奋得睡不着。今天,也已经不早了,我还在写。

Pasion make me crazy, good or not?

2010-11
11

光棍网页

By xrspook @ 23:59:08 归类于: 烂日记

光棍节的今天,很认真地写起了程序。

程序是干嘛的?

是个简单的转换程序,贴图用的,更准确地说,盗链WWE官图用的。之前已经详细说明WWE官图的获得及引用法,但那样做太笨了,Excel是很伟大,但要人手做那种简单但无聊操作,是种浪费。很规矩的外国人,很规矩的WWE网络工程师们做了很规矩的view.xml页面,我们为什么就不能利用一下这些很规矩、直接输出我们想要的呢?

整个下午和半个晚上就在折腾这事,期间非常感谢SH童鞋的鼎力支持!!!!!!

又在瞎蒙PHP和XML上前进一大步了!想当年,我的XHTML和CSS就是这般误打误撞蒙出来的。

XAMPP的单机测试已经成功通过,但手头上的免费空间有这样那样的限制,无法测试,而自己的付费空间呢,也有一点待解决的小问题,所以,有需要的同志请耐心等待。暂时还没通过挂在网上的实战演练。不过,战绩是必须大大地展示的。嘿嘿嘿,虽然我小通CSS,但不打算精细修理网页了,还是让这东西原汁原味吧,太多的修饰会成负累的。

光棍网页一个,但却能强劲地发热发光!

2010-09
28

获取并引用WWE图片

By xrspook @ 18:14:54 归类于: 烂日记

从不同中寻找相同,在相同中挑出不同,人类经常进行这种无休止的辨证探索,毕竟正是那种特殊使其脱离平凡、提升境界。而那种神奇的第六感,也大概只有初次接触,或接触得不多的新手最为敏锐,“新手的运气”这可不是可玩笑的。

爱与恨很多时候都不需要理由,但正是那些理由让观点站得住脚。谁都能脱口说出喜欢什么不喜欢什么,但至于为什么喜欢或不喜欢又有多少人能细细道来。没有达到why的境界,说明你还只是个green hand。

技术与经验,很厉害的一对搭档。一个新人出道,或许TA已经拥有非一般的技术了,通过出道前的学习,揽着一箩筐武器出场很正常,但他们缺乏经验,空有武器却或许不能恰如其分地使用。经验,只有经历风雨才能积累回来,经验或许没有技术那么全面,但它胜在够细致,非常适合实战。我一直觉得,经验是可以转化为技术的,经过规范化的整理,为啥不行呢?无非就是把本来秘密的口口相传的东西文字化格式化大众化,最大的瓶颈是经验者愿不愿意转化。

今天听说是孔夫子的诞辰,于是我写了上面一些貌似很深奥实质很浅显的一些这几天的思想挣扎。

本来打算写个获取并引用WWE图片地址教程,接着发现首秀击倒619,乘着孔夫子的东风,引用一遍并继续细化说明引用技巧:

PS2:WWE官网图片获取
1、WWE官网图片是以flash形式播放的,从网页代码中找不到原始的.jpg代码。
2、以Rey Mysterio vs. Alberto Del Rio为例,它的网址是http://us.wwe.com/shows/smackdown/archive/08202010/photos/mysteriovsdelrio/,观察其中的内嵌flash代码能发现这样一个列表http://us.wwe.com/shows/smackdown/archive/08202010/photos/mysteriovsdelrio/view.xml,很庆幸对这个列表官网没有进行封堵,你能找到诸如/shows/smackdown/photos/15125102/mysteriovsdelrio/SD_574_Photo_073.jpg的链接,加上网址前面的部分“http://us.wwe.com/”,如http://us.wwe.com/shows/smackdown/archive/08202010/photos/mysteriovsdelrio/SD_574_Photo_073.jpg,就是flash中显示的各个大图。由于他们上传的图片是规律的,还能批量抓取下载。
3、大功告成,嘿嘿嘿。相比一些为flash而flash的网站,这般“隐藏”算是简单的了。

利用Excel的“以序列方式填充”功能还能瞬间实现“批量制造”,“[img][/img]”这对Discuz! 代码是干什么的,大概不需多说了吧。虽然,这种贴图引用方法又被称作“盗链”,但WWE那么巨大,小小的坛子稍微揩揩油也是可以的吧。

没有孔圣人伟大,我只摸出了一些低下的小经验,但我愿意把它转化为实用的大众技术。

© 2004 - 2026 我的天 | Theme by xrspook | Power by WordPress