返回列表 发帖

Html源文件中image标签的析取

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

( l6 X2 |3 s8 ]) n) ], X  首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下:
/ B& X2 Q- f, e' U$ X% Q. s! f
: U9 l. z6 a% r$ r0 n; \! Y) U4 s0 W3 b8 }$ {: D: L+ J0 ^# E
<form action=" abstractSRCfrompage.php3" method="post">5 l1 ~$ n1 Y6 V5 ]+ [$ y" }; K
  输入网址<input type=text name=filename><br>, L: B! B3 \: d7 K
  <input type=submit name=submit value="提交">9 O( T9 ?' @! `/ [$ [
</form>
- G2 v9 |* u7 H* z" r% n  R& ]* ?( X- B4 {& {
* \, T2 ~, c4 J5 I5 d( Z$ w
  输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:
- u2 c/ ^, P! p) F# i7 N
; ?* A) t" u& H! z6 g6 @8 X' D4 {- o1 h. c9 w/ m! e+ u& E3 |& `* m/ k
<?php: \# h; }; b* L2 l9 {: Z
if ($filename!=""){
+ r& R+ W) h6 M. y% d' C$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
  m3 X: Q' T" K8 t& X$ e8 Uwhile ($buffer = fgets($fp, 1024)) {+ G, f' ~* ]6 P% D- K- a
$source .=$buffer; }
* {; H$ r, m, M. I6 Lfclose($fp);
+ r& }5 T' X- U8 c" Qfile://查找$source中是否有<img ...src=".../...gif | jpg"> 这样的标记5 y& f* `9 p% h3 d( Z' a
if(eregi("(<img)+[^<>]+(src=")+[^*"<>|]+(.)+((gif)|(jpg))+(")",$source)) {, P! r% u9 C3 R8 C* x" _6 k
echo "找到图片标签:)<br>";}- q& J2 Q) @8 o6 R' k- ?* o. t
else{
7 u7 T4 Y% u% ~1 j5 Vecho "未发现图片标签:(<br>";}
, y, h/ ?# U1 Rfile://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,4 T( K4 w$ N1 _- W0 \/ d5 x; B
$splitres=split("((">)|())+(<img)+[^<>]+(src=")",$source);
1 s1 p6 p0 c: o2 G( H; vecho "找到: $imagenums-1个图片<br>分别为:<br>";8 Q4 f0 T8 ~  f1 I  `. q
for($i=1;$i<sizeof($splitres);$i++){
7 n* @/ ~+ j1 [* i2 f: p! Ufile://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;; \$ M; ]% W6 d& e2 ^$ k, z
unset($imgname); // 再次使用前删除imgname变量;9 c, `6 @" K* c( _( E  J
$imgname=spliti(""",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
9 v# T3 z/ M, X5 W; \7 yecho "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
1 ~) l" O4 d; i; D& Z! e  A}
- U1 p% C: l9 `( K% V}& E( F! _5 @# _9 P" T* G( N
?>
+ a: C/ h  m% x$ F! c
! A! a. H! v3 ^" A& U" ^6 ^. w+ R1 y4 w8 C+ F0 c2 M
  该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets (fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组 splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+ 文件名。, ]' ]4 K$ m' h- |
/ _) d8 j+ h6 J. u1 U8 w
  其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。; D( W' l" W9 F1 n* q: ?

/ M2 {0 u# T& E  {2 y/ i# i* k  好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。) L6 U, c, H' `0 p6 n

. R$ Y& ^0 ]$ T  J  r! F& S, f  如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙?

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