|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。
; ^- u# u# r, X+ r5 m$ X
/ D S( `; N( r2 q2 O 首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: $ W+ g% _; `$ j$ r9 h: Q
6 T$ L/ s5 B% }- J, r3 g
3 J0 h1 M/ `9 X
<form action=" abstractSRCfrompage.php3" method="post">6 A ]( S8 y; q8 [7 K+ ?
输入网址<input type=text name=filename><br>
; M% E; u, {' i: V <input type=submit name=submit value="提交">
3 x3 l: t" j3 M: ^# w& H' x</form> 9 u/ b2 \* Y0 w8 ~3 p
9 j( Q6 {3 r3 `* b" C
4 W ~1 u8 o% V, R; Y 输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:# P; {' g" u9 y
$ z5 b1 \) @! d! |% D0 l$ d
7 \& \* @; @! U9 k<?php( v7 |5 y6 ^. ?0 E4 I" q
if ($filename!=""){
+ N2 D" }0 s2 `! b$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;" w/ ~2 K3 w' N$ u- w" j
while ($buffer = fgets($fp, 1024)) {7 J$ O+ l: X( z9 {/ U
$source .=$buffer; }2 Y& S4 \6 K1 I: t/ l# q
fclose($fp);' u2 H4 T- W$ p5 V
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记
, R, C+ s( J6 U6 U" \( tif(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {, W5 C1 z; [0 t# W( c! V) J6 J
echo "找到图片标签:)<br>";}# C. O7 G% y& }; R8 ^9 u6 y
else{5 @4 h* l1 S. o1 c# h0 s
echo "未发现图片标签:(<br>";}
4 b A) f% C; Kfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,
: R$ K# ?) [& R! T$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
4 B' {; J% t0 l5 v- ~echo "找到: $imagenums-1个图片<br>分别为:<br>";( o3 z& H& { l3 {1 W
for($i=1;$i<sizeof($splitres);$i++){2 `) B" Z7 O2 R0 a& d1 ^
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
& m6 C H; i' l( G8 junset($imgname); // 再次使用前删除imgname变量;1 S6 G$ W/ C5 m5 }* G* @
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
" z6 P: F$ m2 @. gecho "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
" c& z; G0 y' V7 T/ Q' P( U/ p}) \3 I& d/ \% _+ J+ B& Z
}
0 q2 Y. a0 j) P7 g7 p/ {?>2 u' A/ @! h) } w+ ^* h: S8 J
6 v" p; v' l+ R* l+ d' q/ e Y$ Y# P0 }1 \3 v0 G* ^8 ^6 n
该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。
) F$ P# {0 w2 i3 d; P1 K& h6 b! m- M1 m, N0 q- K; S( j) D( h
其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。: V% D+ L% K; @' W" R
, X" f$ q4 c9 K8 g* j0 [, \: U+ i 好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。
2 o, Z5 A( P: P$ b% x7 k2 n* p( o" X$ C* R7 D
如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|