  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。
0 `) D5 h# T/ Z& U8 J7 F5 K
0 a0 D) x3 h8 T 首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: \; }# w9 U6 _( Y* Z# d
" w8 `. y" {0 |
. X% V8 \/ b2 M5 O6 j, }
<form action=" abstractSRCfrompage.php3" method="post">" b# p# E* e# c: i# X' P4 O
输入网址<input type=text name=filename><br>6 l/ p6 p! _: K3 F/ ~$ t
<input type=submit name=submit value="提交">& u# E2 b0 o' f. _- L7 s, y
</form> % b$ K6 {/ x5 v% ?
& Q6 @. _0 |' k' j# s, G) X9 N2 p( I5 t7 ^8 m7 A
输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:6 |" Y0 E O( ~% [$ e- |
- X0 q* n7 l5 \8 W- K
- A, Y( ]! O# K) k0 I1 t% K<?php
+ y v. O r# i1 L( Z& T2 jif ($filename!=""){
+ y8 k8 H% A( \/ ]2 Q8 x0 x6 a5 ^: a7 {$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
) C6 @5 s A+ e% d( gwhile ($buffer = fgets($fp, 1024)) {1 Z4 V9 A- I2 h
$source .=$buffer; }
& ^; K) k) b! q% \! Rfclose($fp);* ]: f0 X6 b: P, J5 g Z$ }, G, e1 E% w5 o
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记$ H* q; s' @# L* b& P$ A
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {; s- e( v9 {. m A. V) l
echo "找到图片标签:)<br>";}1 q5 I/ z' g5 Y* I
else{: S5 D! ^3 w4 c, R
echo "未发现图片标签:(<br>";}5 o* z' y# x0 k4 H* n) J; t
file://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,( \. Z# O( M8 _
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
8 ^ R. P- U8 }" Y) \4 h/ Z# {echo "找到: $imagenums-1个图片<br>分别为:<br>";
, S0 X& \( S) L# T& i3 z, lfor($i=1;$i<sizeof($splitres);$i++){
% M6 l) m4 t; ]& o9 q4 m3 Vfile://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;: B: T* ]( J% p& T4 ~& ]
unset($imgname); // 再次使用前删除imgname变量;; i$ t% N) Y7 r& E
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量/ g7 Q9 q& a9 D( z
echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息% T2 v1 F$ R0 `) A0 B t- I5 ~
}
. f9 ^ Z' l7 L, [" f1 e}
; }0 Z m! d7 k% b5 @, w% ]?>9 O r# U- S% q% V( e% ?
1 ?% w" [, Q+ N
8 `7 T& b/ E$ X2 l L 该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。/ [! G+ g% M, [9 \$ |
0 ]& Z: r6 F" T! R6 Q9 j4 d) b3 ?: H
其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。
& K5 d# H! v7 r3 |& S+ y
1 P9 w9 L4 [1 r5 y9 @4 W+ { R% ] 好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。* \8 `6 x6 K6 M2 y
8 ^9 Q+ F. V4 a# V$ M7 T9 f0 Z 如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|