  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。 ( g5 b* a, V1 c9 M; i& H/ u
; u1 S7 S- `7 }* p 首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: * d$ {% Z* o7 f0 i; C5 t
* m+ |; v3 U2 K* ?9 G2 k
2 {6 g2 a- z) H+ ]3 i) V3 ~9 B<form action=" abstractSRCfrompage.php3" method="post">/ X/ j* Z: C$ `
输入网址<input type=text name=filename><br># x: O5 u# U5 \. c' G8 j: V' w
<input type=submit name=submit value="提交">
% d$ Y! m3 C7 U7 @/ f/ v. g7 x) Y</form>
0 Z w: I- u% r# J. a& M( P: z- B2 `- x& m1 H# Q& q
+ e: s; Z' x0 z) P V Q4 z
输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
6 r' {) V0 T7 d0 w& ?
6 ?6 b- O& V. h/ W0 v5 r+ N8 l: ~! b! Z) d
<?php
6 f, I7 ]3 s) F' K& N& ]( Sif ($filename!=""){
. T) f. w( K) T1 B: l5 e! x$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
1 l5 c) {% Y) X1 D* q( dwhile ($buffer = fgets($fp, 1024)) {
5 G; S, E6 b# {; T% X* ?, P$source .=$buffer; }( e8 |5 r1 T' z8 \9 g
fclose($fp);+ ]0 |- S' T4 w9 l
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记' C" ~1 S5 _5 e7 g+ f
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {
; S7 m5 G8 P0 b' C, b; n. gecho "找到图片标签:)<br>";}+ J" q+ [" e2 G- v
else{
1 d4 j& |/ j- E2 G4 p" `( E! K2 k- zecho "未发现图片标签:(<br>";}
* B' `4 `* ~ Nfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,- M# Y6 a) A/ M$ z
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
; R8 Z$ |! Q5 Yecho "找到: $imagenums-1个图片<br>分别为:<br>";, g6 y/ r. ]. G0 R) l p: q
for($i=1;$i<sizeof($splitres);$i++){* H( o5 e) w* k5 o
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
7 _# i: U4 l$ N. S& s( Y8 Y0 Qunset($imgname); // 再次使用前删除imgname变量;
- Q# X2 G" q: ^/ U3 q2 K$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量! ?4 `) O( N4 `2 W" F, T! T
echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息5 @! K' P+ z, G5 W
}1 _, Q5 k" V' R; x# T* E7 R! G0 v
}
' R0 ^/ J9 c; e, z6 [8 P- u?>
$ W, r6 b) G; j
6 E S8 M" x0 R6 ^4 R8 ]; ^
/ g( @- N( k" L 该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。
' h; F; b: L% p1 }3 O/ k
2 Q& `, |, G6 `! z' i4 z 其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。( H v. B, s$ G% q% d
: G1 c9 B2 P2 I) ?2 ?! ?: U6 s6 J 好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。
4 |0 g! s; \& ^3 }$ l: m
0 K9 X! F) y+ U' M 如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|