返回列表 发帖

Html源文件中image标签的析取

今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。  
( Q3 D  J  \9 x) [% L
) M" r6 P  s# V" R+ x+ @  首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下: ' I7 i7 W: K! U) ?; |: X2 ]  V
8 q' E# J0 p# b: M  N% `

, g: {: P- {" [5 R' ^8 _<form action=" abstractSRCfrompage.php3" method="post">+ ?# g% v; ~. p; w) [! [% Y
  输入网址<input type=text name=filename><br>7 y, ]$ `  a; {, o' T
  <input type=submit name=submit value="提交">8 X" P! ]2 g+ n* S5 q) E
</form>
9 G% x) ]$ r6 a0 Y" W# p
6 }- B2 b0 G1 O9 q) [6 x  c0 @4 k! B' i' a4 Y
  输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:: ^  M* S% h+ n  x3 `; d% G! c: ]4 d' p* u" x

& Q0 f+ C4 ^; [7 K7 W6 x: V* R( _' b$ W+ \
<?php
! B1 B5 f$ b2 e. Xif ($filename!=""){
$ K2 }4 g9 a  j- r" S# ^) S$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;9 J9 P  g4 U0 f# N# z8 {
while ($buffer = fgets($fp, 1024)) {5 E/ h6 R+ w' w& w- v% A+ T. o: _
$source .=$buffer; }/ _9 _/ u  \1 `; ]! i
fclose($fp);
8 t3 t3 b8 ~$ d1 ]* F- ~- F' sfile://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记, l6 k+ F6 I9 g, A$ m( [
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {
" T5 I2 r! j! r5 Necho "找到图片标签:)<br>";}
3 u) L) n+ _( r: q# S: Delse{" d: m, x- A. v* }
echo "未发现图片标签:(<br>";}
2 s/ ~* T% r* zfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,
8 Z" |; u+ m( R' c1 ^6 |$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);$ R( u) \+ g! `$ T) o* `
echo "找到: $imagenums-1个图片<br>分别为:<br>";
" Y' T( n, X8 v2 Xfor($i=1;$i<sizeof($splitres);$i++){9 l4 ]3 d5 V" S* t7 B9 \* e
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;- x; e8 g* |- Z" W; F
unset($imgname); // 再次使用前删除imgname变量;" T) t% |$ I/ E8 h4 o7 E: k
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量4 U# v  [1 c, m4 R! {9 K
echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
+ C4 b+ z0 d: v2 h. R5 y. T7 Z7 N/ B0 r}4 S1 s+ p1 \# `2 T% z$ _( }2 _
}
+ J) a/ l! z" I, ~( C1 A% X% D* ^( \?>. }+ y' S7 s5 D% z1 g7 u
; A; |  f+ u* j8 w
" S' }; ?3 {4 m. e8 @
  该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。: m% {& X) ^  K1 ?8 B( }8 J' R( `
9 Z4 z. X2 o0 Q0 w- Q0 y
  其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。  u) c# `# l$ `& f( _% L! [
5 s+ x7 \0 t( B5 x
  好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。
2 P+ O' B7 ?  |8 b/ I3 u( t/ ]+ O( _3 V7 G8 N
  如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙?

返回列表
【捌玖网络】已经运行: