  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。
: K6 W0 Q, F5 t1 `* [$ W: }9 U6 V" G0 P7 J; ?' y
首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下:
$ j, X% n [- {3 P. Z ~" i
3 ~# I$ d$ o, N3 r" g
6 _6 ^/ I& T3 e& X1 L" l5 e<form action=" abstractSRCfrompage.php3" method="post">
7 t4 o C6 B4 ^% \6 z2 g 输入网址<input type=text name=filename><br>4 `+ S4 ?: p4 \3 u# u& S3 K: o4 n( i# R: k
<input type=submit name=submit value="提交">
9 Z( q# x5 t* X+ {</form>
" C y7 Q R# C( h! H p
; S" E! q6 X I y3 l0 L: v1 f, U, ^" [: ?8 U$ D8 y
输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
7 ?2 ^) c% M: L: H4 u; i' E( `! [0 |/ t4 R4 p. l6 S- }8 [4 S
; ]1 Y! v+ F/ F2 Z l- t4 Y<?php
+ P: U1 X( a3 S3 l6 {/ z) Aif ($filename!=""){! N% X* s; P7 _
$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
+ i4 S6 H5 P: z& T# G2 {& vwhile ($buffer = fgets($fp, 1024)) {! P6 @/ K% M# S
$source .=$buffer; }6 j% S# g4 M- j/ n5 I5 p: I( c
fclose($fp);2 U) q; k0 k/ C) \ C* A, Q, p
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记
' d/ B" @; G7 e4 ^if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {0 Z- s& y) e3 B2 a5 i
echo "找到图片标签:)<br>";}
- [, `+ u( B! M& t& e$ w1 nelse{& \9 Z9 p3 L; g
echo "未发现图片标签:(<br>";}
7 v) s5 K; o) F- F# Nfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,) u8 p7 }0 N5 d1 b3 q+ }. B
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);) T. h6 h$ [$ R6 Y. j0 [
echo "找到: $imagenums-1个图片<br>分别为:<br>";1 y0 p9 A+ o. V% W: Z' n
for($i=1;$i<sizeof($splitres);$i++){
3 {$ @2 `! v' R* wfile://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
$ b7 @/ V0 N5 g" l/ `. ~7 \unset($imgname); // 再次使用前删除imgname变量;
$ \3 O4 ]' ^ |( C* y' w5 o; e' b$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
7 ]/ D$ i4 g. S# o% R* vecho "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
& A% M" K+ b# w, y2 ?7 J; e}
# z& U# y, O9 @" u4 ]% k4 N d0 v4 n}
8 V: N$ q( W% @4 v" I: L! E: h?>$ u/ ~# H3 {+ {5 L) T
& N1 n/ `" ]8 f" G G7 _' r$ B+ o1 `. c% |' k6 z
该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。0 ]/ x- c0 [3 s: f
1 y, k0 n9 h$ [0 f. {* p
其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。$ y5 ~$ e' Q" r/ D0 g5 \
! X# T/ ~7 L0 | f% A
好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。, Z3 M5 a4 N) ~( |" I3 q" u
+ L& F1 D; `+ @: q 如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|