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
13

YOU ALREADY KNOW THAT

By xrspook @ 22:51:02 归类于: 烂日记

终于在SH的提醒和帮助下,在已经注册的几个国外免费空间里正常运行起YOU ALREADY KNOW THAT,我见简称YARK,按照首字母缩写应该是YAKT的,但误打误撞,变成YARK了,呵呵,YARK太短,所以注册的二级域名前加了我的戳“X”。正如YARK里的《h1》内容所标示:如果你是我的同伙,你会知道那空荡荡的网页是什么,怎么用;如果你想在这篇日志里直接找到答案,很对不起,在不跳转继续阅读某些链接的前提下,不可能。又或许,你真的很想知道,email我吧。至于我的联系方式,细心的你肯定already know that。

闪亮亮地放出一个YARK的地址:http://xyark.serw5.com/

很高兴地告诉大家,今天的YARK又实现了一个新的功能——直接把页面的title也输出了(并非各自的小title)!哇咔咔,如此一来,可以利用从RSS读到的地址完成某事,再也不用手动敲打某些代码了!

想变得懒惰欲望让我变得勤快。先花费一些时间制定规则,之后就可以拯救一些人的很多时间了。这就是程序的力量!!!!什么规范化管理,什么质量管理,如果你是个程序员,那些道理you already know that了。

说回YARK昨天没成功下海,原因是我完全是个PHP小白,所以碰得一头灰。通常,服务器基于安全考虑PHP的allow_url_fopen选项默认是OFF状态,免费空间通常都只会是OFF。而在PHP中需要使用file()[又或者file_get_contents()]函数获取其它站点的数据时,中招了,OFF状态就会出现一个“Warning: file() [function.file]: URL file-access is disabled in the server configuration in ***”的错误。幸好,我们还有第二招,cURL。在PHP程序里加入一段curl就能解决问题,但,这也是有前提是,curl是PHP的一个扩展库,所以,你的PHP系统的这个扩展功能必须处于enable状态,有些免费空间里curl是处于禁止状态的,那囧啊,不过确实存在,远在天边近在眼前的例子就是默认状态下的XAMPP。

也不管行不行了,把curl代码加进去试试再说,代码引用如下:

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
< ?php
/*
* @return string
* @param string $url
* @desc Return string content from a remote file
* @author Luiz Miguel Axcar ([email protected])
*/
 
function get_content($url)
{
	$ch = curl_init();
	curl_setopt ($ch, CURLOPT_URL, $url);
	curl_setopt ($ch, CURLOPT_HEADER, 0);
	ob_start();
	curl_exec ($ch);
	curl_close ($ch);
	$string = ob_get_contents();
	ob_end_clean();
	return $string;
}
 
#usage:
$content = get_content ("http://www.php.net");
var_dump ($content);
?>

实际应用时把http://example.com代替http://www.php.net作为数据输入,然后网址会经过function get_content($url)处理,进去的是一个网址,出来的是一个对网址所代表的网页信息进行处理后的字符串,也就是说,$content是一个包含所有网页信息的字符串,你喜欢怎么折腾就怎么折腾好了。至于那句“var_dump ($content);”是把$content的内容输出打印出来,你或许不会用到。不知为什么可以这么神奇,但就是这么神奇。PHP默认设置下不能实现的功能通过cURL就能实现,但实际上,最终效果是一样的。

再次感谢SH童鞋,也感谢那位写cURL挽救世人的巴西童鞋,是广大程序员让我感觉我是站在巨人肩膀上的。

也愿YARK能在它的用途上发光发亮。

标签:, , , , ,
2010-11
12

无处安家

By xrspook @ 23:53:14 归类于: 烂日记

花了一个早上注册了接近10个国外支持PHP的免费空间,无一例外,都不支持我的小转换程序,泪流满面啊~~~~ 基本上都是不允许file access,巨囧。不就是借php处理一下文件而已嘛,导入XML输出XHTML,仅此而已。不是大奸大恶,却落得如此下场。有些空间是不支持的,有些空间是不知道该怎么用的,么法语、俄语、匈牙利语,按G翻译都按到手软,到头来还是不知从哪里下手。不得不说,郁闷到极点的时候,我怀念我的英语和西语啊~~~ 西语从来都没有让我如此彷徨过。

完全不知道该怎么办了,难道要把程序一直挂在我自己的地方?其实呢,也无伤大雅,因为从页面和页面源代码你啥都看不出来。因为核心php部分都经浏览器处理了。机密,也不能算机密啦,不可能漏出来。光看这个网页,没人能看出这是干嘛的,除非你是高手,你故意探我的php,但如果你是高手,自己就写php了,根本不用来探我。

真没想到,想找个支持的免费空间也这么难。

Warning: file() [function.file]: URL file-access is disabled in the server configuration in /***/index.php on line 20

这句话让我揪心不已。

初出茅庐的小php只好到窝在家里坐井观天了。

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