  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。 ( q7 E# P" A! ~9 i1 O
# Q4 m1 P8 z1 l4 Y6 r$ R# X
首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下:
" a; ~$ {7 R: n e. C& T: p
n0 v1 R4 ]6 s1 u1 `8 |
8 v) k/ ?# x7 x7 K<form action=" abstractSRCfrompage.php3" method="post">
. N7 ]" c4 ~( L7 C: y 输入网址<input type=text name=filename><br>. y& U' X# j1 J# Z& m
<input type=submit name=submit value="提交">
8 E4 N7 W" b' y: n</form>
, @8 S+ i2 t, g8 X1 c j* Z; q B! c L/ \% n# Z5 f0 Y
) L2 f+ |8 a( }, d 输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
2 Q/ ]- _$ `9 G4 [0 ^8 o' ~7 {8 U) U, q, P4 c& l
9 X7 A' }. ^$ H* E5 t2 \" Z6 D+ Q<?php
5 e( {2 U$ T; s% Q7 `if ($filename!=""){
. U" i5 _# \+ Q0 |6 |0 [$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;0 D- s5 q6 |: X% H; Q$ p
while ($buffer = fgets($fp, 1024)) {+ f& E5 h) N: J$ N; w3 h
$source .=$buffer; } h/ s" [1 F5 M% j0 j
fclose($fp);+ \. O- W- l6 t7 G, ?! g* \
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记
. q+ W' G- b3 [+ g1 n- u" r3 bif(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {) h* a9 A0 [! j& l& `
echo "找到图片标签:)<br>";}$ M8 l' A. L4 H) h0 T- p4 ^" ]
else{
, W' D z# a3 A2 q' ]( R% becho "未发现图片标签:(<br>";}/ O9 M3 p; h2 Y) i/ w
file://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,! I ~4 W3 I2 M( ~8 X
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);) E. F) H% u) S E9 r$ e8 H
echo "找到: $imagenums-1个图片<br>分别为:<br>";. ^5 z/ Y& G m. i; u9 N
for($i=1;$i<sizeof($splitres);$i++){
. z3 v: r3 v! q8 k$ Gfile://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;) q5 v- n$ d( L
unset($imgname); // 再次使用前删除imgname变量;7 F/ p. R$ T4 @& E
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量6 `- b7 f1 i6 u. l# L
echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息9 W* w$ P5 d( b* \" j
}
) k" X$ ~* {. M! z/ @! f4 B8 H}0 U8 m+ w2 u" I% z
?>
& L8 {% Y/ l5 G4 B& \( @7 N* o: E7 Z8 ?2 Z+ P# L& g4 z6 `
# H' y4 ^. Q' H# m* M+ I
该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。
" J& N; S5 S: W) Y5 Q" a2 c2 @8 D6 p2 L0 a' S
其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。7 m! Y. l. ~: I3 Z) E
2 W, O. {9 W4 J u5 u8 L
好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。
; e% C1 s8 E+ R' b
. k4 n$ n0 p- r x& X Y# | 如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|