获得本站免费赞助空间请点这里
返回列表 发帖

Html源文件中image标签的析取

今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=".../... /abc.jpg"> 中的文件名".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。  - p& y& v1 L% A. S4 F; `

4 l4 G' e6 ^* b6 ~9 r2 \  首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下:
& N  l4 G2 o! ~3 I4 _& D7 T, g7 I  T: r. M( |+ x" ?
3 {# V0 y! H' }' y
<form action=" abstractSRCfrompage.php3" method="post">7 b7 g1 h0 K) k7 M0 b3 _
  输入网址<input type=text name=filename><br>" ?9 \* F6 E8 A
  <input type=submit name=submit value="提交">6 S1 N0 ?6 m: d# M
</form>
( Q$ L# ]0 [7 }+ U& M: K4 q
7 `& O5 i+ i! G/ k: D( A
" I3 L' n: G+ O, e. c: C4 Q  输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
) J/ S2 Y) ]- C* I; T3 |! `" Y$ D5 G+ w4 k

' Y) Y5 ?# |* y% {* P+ T<?php8 }" _6 y  H  ]$ _8 P
if ($filename!=""){
% h! J, n: g2 k8 _4 k& G8 W. x: u$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;7 }# U  ~, p: l+ E; R
while ($buffer = fgets($fp, 1024)) {
4 x3 s0 Q% F7 y: V$source .=$buffer; }
4 {' s. |9 }( `& N: ]fclose($fp);
- {' M8 p! e9 q6 \, R) Jfile://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记' L# G; @: g/ ^+ S1 u
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {4 N' U: E9 o' f
echo "找到图片标签:)<br>";}& x  g9 V# [4 \: s
else{
8 A1 N. B' W" b; w) Eecho "未发现图片标签:(<br>";}
( G: ~2 X! [% d% T/ bfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,
* U' e- b1 V0 O; l$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
/ e4 g; F+ P6 K! p9 hecho "找到: $imagenums-1个图片<br>分别为:<br>";2 r  ^- U/ M& ~1 W# q- W
for($i=1;$i<sizeof($splitres);$i++){
' e* z7 |/ Q0 N$ Wfile://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
+ J- Y, j& O+ ]7 t& Vunset($imgname); // 再次使用前删除imgname变量;0 c* y! c) h8 I% X, y* ]1 {
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
2 f6 e3 m% s6 w8 `echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
; ?6 O. D$ d% B0 Q7 _}3 q& m; D" i; W& C" W3 ~: W
}
" V' e+ a/ u7 G1 H* u4 J?>: M: E+ I  N% w8 T7 M7 E0 N, z3 s

8 Y; C: `, t& J9 r0 U! O5 w5 i
" Q" T( a! R3 S9 }  该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。. j* s2 Q1 T, j% R) q2 r4 x! M  [% z3 s
: l5 p+ y6 U6 i$ p: {$ R
  其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。& z% o: S9 X+ q; z* h6 ?* g. U$ |+ w

9 b2 d" p" I. w* U  好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。# Z/ D. J' @, r9 W2 R1 ~% A

8 t: P/ L7 _1 s- ~& S9 Y  如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙?

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