|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。
) D& }, D: j" D3 I$ ^; K! ~3 o; `$ {7 c1 ?: W
首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: ; V) z8 k* a2 F
7 z/ k) c5 c- c( B+ E$ [ L
* z$ _/ ^, U* ~0 d. e; ~2 H+ i
<form action=" abstractSRCfrompage.php3" method="post">
7 j. _( T$ s+ n ]; G+ y$ X3 t/ X 输入网址<input type=text name=filename><br>
8 b9 j+ t& c9 x. k <input type=submit name=submit value="提交">
& n7 P3 H! G" T% [( t, ^4 ]: O</form> 3 @6 A y8 j; X4 z) p K1 X
* d+ l5 S5 V, {, D+ H2 E) Y$ |
" d9 |- n" p# D- O r8 `! U 输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
9 h7 v% r2 f* E) a! k
" G! R W# x4 K7 P" B( T7 X0 s) J: Q( H8 J" |0 p) j$ x
<?php
& m' L, P, Q* Z5 P1 t, E4 sif ($filename!=""){
, p0 E' H2 G- }* N4 Q$ W5 v$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
- a( E, k' g, X% U, i- iwhile ($buffer = fgets($fp, 1024)) {( E4 p3 q1 v n, f3 P V
$source .=$buffer; }
3 m+ w, q9 I- t' n. Kfclose($fp);0 l1 G# ]2 I7 ]( u6 M
file://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记, V f3 w. G/ _7 N: J: H3 o
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {# d! w" ]: X9 a( Z) l
echo "找到图片标签:)<br>";}( A: ]0 q7 o6 ~8 j1 p
else{1 _: N4 ?0 T2 o; z+ H J. i
echo "未发现图片标签:(<br>";}
2 ]0 M# r6 V8 k+ ifile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,' F, F7 H" T) ~% n: i h: {
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
) w- V, Y, ]8 D( N. I) Necho "找到: $imagenums-1个图片<br>分别为:<br>";
" t8 F3 m- b8 V' p/ I9 ofor($i=1;$i<sizeof($splitres);$i++){
2 \- E3 e+ `) `file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
* q) a; z& C7 }unset($imgname); // 再次使用前删除imgname变量;$ z. O V! C! h6 e( {8 u" t
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
5 m- [; Y( m. v- s0 Q; Necho "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
5 E6 G! v; R4 o: Z: j1 z; \}7 H4 E; z( y/ t3 x: j( x
}
+ d9 C9 p1 m/ z6 f/ b9 O?>
3 r2 X( K- ], b" u# o- g$ W3 `6 i- f
) P- C t& q: K9 S" B
该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。7 f7 j: _+ r$ J% Z# n' Q
" s$ u3 q6 E, L3 g
其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。
7 h! s( G0 D4 x4 r6 z1 ~
$ p/ p$ n3 w8 H0 R: K) E- h% h 好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。
% J5 S: B" J4 l$ L2 z: l0 L! C K6 H Z: N9 f3 I+ Z4 E
如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙? |
|