|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14391
- 金币
- 2481
- 威望
- 1647
- 贡献
- 1429
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。 , r% w6 @: p1 P, k8 M" `) ]! j! u
: L1 J {0 l9 J( p6 A" R 首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: , @ x( i& h, T% y# k8 u) |
. `& D- L; Z! W8 K) u
! M6 Q# X9 q0 B<form action=" abstractSRCfrompage.php3" method="post">6 Y M, j+ ?( `, Z: z5 Y
输入网址<input type=text name=filename><br>+ n, T$ F* c2 F+ B
<input type=submit name=submit value="提交">8 D: r5 V5 k9 p4 G- o& m! o& A
</form> 9 f1 Z7 w1 M& `0 ?2 ? O
1 P. f2 B9 W: n2 d. O
) ]- G- ?& x# g+ N+ t! J! | \* v
输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:5 X4 t/ I2 L5 H0 \7 J* j
6 K' A' m5 A% b$ Q) {6 m; \, X6 l" d% _8 t
<?php3 o! g# U5 r) p
if ($filename!=""){, Q C. c( ^! ]1 F {; x' i, `% C. l1 U
$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;. {/ J2 |; m8 E
while ($buffer = fgets($fp, 1024)) {
2 r$ h5 C( c8 C5 `! J9 k" u$source .=$buffer; }
, z( ?" T: d* G7 Q. ]fclose($fp);
* }* I9 P" e) R) Mfile://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记4 Z! x% Y: i7 b6 n( q
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {
% s2 t4 ], v6 g6 i& ~: b M1 }2 L9 Becho "找到图片标签:)<br>";}. L3 r3 d1 R a& @ X) ^
else{
( X" a7 \, M5 Z! W4 U, ^" fecho "未发现图片标签:(<br>";}
) b' Z& G8 W3 @- Xfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,
- t/ `3 ?! l) d( F+ R8 |$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);. d/ T& G( b1 j, D( C
echo "找到: $imagenums-1个图片<br>分别为:<br>";4 t. T- x `6 E8 v* u
for($i=1;$i<sizeof($splitres);$i++){9 _* H/ e( I9 e( p$ S
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
( B. h% t' n3 B" ]: v- o5 Z- Eunset($imgname); // 再次使用前删除imgname变量;
/ H( [: L1 G) v; }$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
0 u4 @: X+ c$ Necho "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息' `4 F- \$ U2 y" M
}
7 s6 p- ]* i4 o}
. i* h1 Y; g9 Y?>
+ [7 ^) K4 P" {, A2 ]
; j: a; g" X' W. ^* t3 S D. s- o& s, m+ B3 R0 ^% @
该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。6 v# o' Z2 I6 v- u! \+ r( W
0 E& U/ n0 |; |$ h9 l3 j 其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。 Q$ [5 r/ v4 `: _) `1 Z+ V, P
& E( N: h* ]& N" B- g 好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。
0 M% p4 @3 z- m y* ~& g# g2 _& M/ U5 b
如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|