  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。
# O- E% t1 F7 d/ l5 H2 B5 G0 p- ~ d: t
首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: 1 s1 @3 V+ m+ }$ v2 Q
0 C$ x- Y1 y& J; N, `, k7 T- q
6 t' S- `; [4 m<form action=" abstractSRCfrompage.php3" method="post">1 [, l) G3 W9 j0 C) A% E+ \1 \
输入网址<input type=text name=filename><br>' @5 x/ `7 p3 ]/ q8 U
<input type=submit name=submit value="提交">
; J/ M- v, r$ m2 Z+ J* p</form> 6 {. [) Y1 l# k% Z/ Z4 ?7 g0 c% D
. G* I- M; p) m/ b9 H
9 D% v+ O/ i7 h4 Y3 l& O2 M 输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
( e4 k/ K: C4 O2 S. T$ R+ y+ s$ K# F2 v
9 j* n* j7 s0 ^7 Z* m8 W- F9 x
<?php
( V# l3 ^8 k- Zif ($filename!=""){
0 o! r# s' c, l5 Z6 O* @$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
6 d( i! Z. o( V4 q# j4 gwhile ($buffer = fgets($fp, 1024)) {
* }1 m! J @( y8 r4 ~$source .=$buffer; }. l+ x! Y/ _% A: x6 M0 ]
fclose($fp);( |0 }; @ s8 Q2 H
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记
! U/ r4 B/ _$ D1 o/ J% L7 Jif(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {
. m( j/ _8 u. [7 {* F" Y8 \" |echo "找到图片标签:)<br>";}
2 f, J8 p8 M B) o$ D& p2 N6 a& Pelse{' a; W1 M. m4 p! j
echo "未发现图片标签:(<br>";}
+ t2 ^( p! W1 k4 Afile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,) l0 ?5 c; e+ Y( T! q$ O% J# q" X$ W
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
$ n9 a7 {+ p$ ?7 v. {echo "找到: $imagenums-1个图片<br>分别为:<br>";
+ j7 T# x8 b# Y8 Q% J( F1 Zfor($i=1;$i<sizeof($splitres);$i++){7 J, s! H# y* m+ B& p' o# _
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;- C7 i* X4 f1 G0 R" |5 Y
unset($imgname); // 再次使用前删除imgname变量;
5 r7 ~! c' f5 R- z2 T& u7 v. X8 E$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量4 p8 j7 h; ^7 z9 R2 C x+ l
echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
9 `1 S2 i# B& o! {7 s" i" s2 [}
0 I+ J2 V" X! T" z1 b; T# ^}4 a: Y0 h n% T! b
?>
- R, ~* n- p# x; ~. m8 R# l R! L% x0 x% m4 ]0 M
: e' i# O* Y; u1 {- `2 [
该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。7 Q. k% b* h( N
$ J$ a: F9 ~/ ]& I# z9 v& P; S% f 其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。
: b( ]9 u" m6 J) c' J0 A9 ^6 [: l' N4 r8 Q5 m- Q
好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。2 A f- z2 H( o" x7 c9 c0 X
) U( w! F d; M: j9 m# [
如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|