  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。
O& S1 I3 U h+ U3 l% r7 o9 M z0 L# [0 {2 a
首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下:
4 |% @- C+ [9 [ H+ a; A. A
3 r3 v7 A& E$ L6 b! \+ t' _ {
( N" N m' b: |<form action=" abstractSRCfrompage.php3" method="post">
5 v: A. T- k; c& Y5 c& p# e( D 输入网址<input type=text name=filename><br>; u% n# C4 H3 n+ ?: J. `% W
<input type=submit name=submit value="提交">
?4 [3 @1 D: t</form> . w2 ]4 Y( s, q. t8 y
. N5 e8 T+ s9 w9 m! h/ s! J) c, X
- z! V; y5 ~/ k' t 输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
/ o$ M5 S; t- u: ?% M8 V+ T
. _9 G" r2 A* ]7 \4 S
) _1 w5 u8 |3 m1 @; v<?php2 v8 I" }/ C G. X. h7 g
if ($filename!=""){- v6 V9 M; D2 f7 @( r* p
$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
! w1 a% P: @* P/ d* w8 Z; Kwhile ($buffer = fgets($fp, 1024)) {
$ V6 t) X1 t9 W$source .=$buffer; }7 K, V( l4 L/ U5 N, C
fclose($fp);& Y2 F. f1 r2 a" \# ?7 X
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记# Z. D% h9 e/ g: h4 V
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {" h, J/ y4 q8 g, W; [
echo "找到图片标签:)<br>";}
7 P2 I- q0 E2 [else{6 o2 }" E4 F$ a7 W
echo "未发现图片标签:(<br>";}
- g) p$ ?- |& e! p2 M' Gfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,
) d; b w( [; }6 d, |$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);( d, @- K" ]. p
echo "找到: $imagenums-1个图片<br>分别为:<br>";
! R) a- G$ k( hfor($i=1;$i<sizeof($splitres);$i++){) [2 A0 }8 i- G7 Q9 e5 D5 e
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;' \2 k6 g9 z f$ H3 B2 C# ]. X/ Y
unset($imgname); // 再次使用前删除imgname变量;+ T2 `$ L- p+ |9 b. o) q
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
" w$ F5 E* l4 f" N9 Fecho "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
& V8 F1 F7 f& L+ U! e}5 O# z0 v( m/ }) L& x
}) u! r, C8 ?2 D& F0 c# B4 b' x9 K
?>( D) R. t9 I) w+ _% j$ D5 n
1 v) `# j6 a0 u) c
) g2 U& O7 _% K" W! X- ^* J 该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。
/ A5 I- r! x, i# P1 @# S% w9 @% K' }2 N9 d4 ^' ]
其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。/ J& f4 X v( v8 Z& t4 i
$ A2 D6 f; Y- g& p
好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。& Z( ~& Y0 c0 A
# `( w7 u8 ?1 `
如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|