仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1105|回复: 18
打印 上一主题 下一主题

[学习教程] PHP教程之PHP获得网页上恣意表格中内容的通用法式...

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
#
发表于 2015-2-3 23:54:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。法式|网页     转载请接洽作者:Email: pengwuwang@21cn.com   darlingpeng@sina.com
  在任务中,常常需求对网页上的表格内容停止处置,然而,因为表格内容制造过程当中的随便性,跨行跨列常常产生,所以我作了这几个函数,以获得表格的内容,法式中主要的中央已作了注解,所以在此不再反复申明,经由测试,十分胜利.所以拿出来供人人同享.<?php
//作者: 王朋武
//日期: 2005,3,31
//目标: 获得网页上(恣意跨行跨列的)表格中的内容function fun_proc_rowspan($l_str)
{
$l_a = explode("\n", $l_str);
for($i=count($l_a)-1; $i>=0; $i--) {
  $l_str = trim($l_a[$i]);
  if(empty($l_str)) continue;

  $l_str = eregi_replace("<td", "<b><td", $l_str);
  $l_b = explode("<b>", $l_str); //若有n个<b>,则分红(n+1)个组,最入手下手一项为空.
  for($j=0; $j<count($l_b); $j++) { /*不克不及反过去(即从右入手下手),不然在有些情形下会有毛病,由于在表格的一行中若有几个一连的格跨行,则必需从左入手下手,不然下一行的列数便可能不敷盘算,即盘算跨行时保留的列有能够大于下一行的总列数, 则操作就不会胜利. 实测也证实.
  如 +----+----+----+----+----+----+----+
     +----+----+----+----+----+----+----+此一行保留7格, 前6格都有rowspan=2
     +-----------------------------+----+此一行只保留2格
     +----------------------------------+此一行只保留1格
  */
   $l_str = trim($l_b[$j]);
   if(eregi("rowspan", $l_str)) {
    $rowspan = preg_replace("/^<td.+rowspan=[\"\']?(\d{1,2})[\"\']?.*/", "\\1", $l_str);
    $rowcont = preg_replace("/^<td.+rowspan=[\"\']?\d{1,2}[\"\']?.*>(.+)<\/td>/", "\\1", $l_str);
    $l_a = fun_add_row_td($l_a, $i, $j, $rowspan, $rowcont);
    $l_str = implode("\n", $l_a);
    return $l_str;
   }
  }//end of for j
}//end of for i
return $l_str;
}function fun_add_row_td($l_a, $r, $l, $add_n, $add_cont) //l_a是数组, r是拔出的入手下手行,l是入手下手的列, add_n是跨几何行, add_cont是加的内容
{
for($i=$r; $i<$r+$add_n; $i++) {
  if($i == $r) {
   $l_str = eregi_replace("<td", "<b><td", $l_a[$i]);
   $l_b = explode("<b>", $l_str);
   $l_c = "";
   for($j=1; $j<count($l_b); $j++) {
    if($j == $l) $l_c .= eregi_replace("rowspan", "", $l_b[$j]); //去失落rowspan
    else $l_c .= $l_b[$j];
   }
   $l_a[$i] = $l_c;
   continue;
  }  $l_str = eregi_replace("<td", "<b><td", $l_a[$i]); //加<b>分隔符
  $l_b = explode("<b>", $l_str); //以<b>分组
  $l_c = "";
  for($j=1; $j<$l+$add_n; $j++) { //略过入手下手的空项,从1入手下手
   if($j == $l) {
    $l_c .= "<td>".$add_cont."</td>";
   }
   $l_c .= $l_b[$j];
  }//end of for j
  $l_a[$i] = $l_c; //更新后的新内容
}//end of for i
return $l_a;
}function fun_proc_colspan($l_str)
{
$l_a = explode("\n", $l_str);
for($i=0; $i<count($l_a); $i++) {
  $l_str = trim($l_a[$i]);
  if(empty($l_str)) continue;  $l_str = eregi_replace("<td", "<b><td", $l_str);
  $l_b = explode("<b>", $l_str); //若有n个<b>,则分红(n+1)个组,最入手下手一项为空.
  for($j=1; $j<count($l_b); $j++) { //此处不克不及反过去,必需从左到右取表格内容
   $l_str = trim($l_b[$j]);
   if(eregi("<td.+colspan", $l_str)) {
    $colspan = preg_replace("/^<td.+colspan=[\"\']?(\d{1,2})[\"\']?.*/", "\\1", $l_str);
    $colcont = preg_replace("/^<td.+colspan=[\"\']?\d{1,2}[\"\']?.*>(.+)<\/td>/", "\\1", $l_str);
    $l_a = fun_add_col_td($l_a, $i, $j, $colspan, $colcont);
    $l_str = implode("\n", $l_a);
    return $l_str;
   }
  }//end of for j
}//end of for i
return $l_str;
}function fun_add_col_td($l_a, $r, $l, $add_n, $add_cont) //l_a是数组, r是拔出的入手下手行,l是入手下手的列, add_n是跨几何列, add_cont是加的内容
{
$l_str = eregi_replace("<td", "<b><td", $l_a[$r]); //加<b>分隔符
$l_b = explode("<b>", $l_str); //以<b>分组
$l_c = "";
for($j=1; $j<=count($l_b); $j++) { //略过入手下手的空项,从1入手下手
  if($j == $l) {
   $l_c .= eregi_replace("colspan", "", $l_b[$j]); //去失落colspan
   continue;
  }
  if($j == $l+1) {
   for($k=0; $k<$add_n-1; $k++)
    $l_c .= "<td>".$add_cont."</td>";
  }
  $l_c .= $l_b[$j];
}//end of for j
$l_a[$r] = $l_c; //更新后的新内容 return $l_a;
}$l_str = file_get_contents("test.htm"); //获得网页内容$l_str = eregi_replace(".*<table", "<table", $l_str);
$l_str = eregi_replace("</table>.*", "", $l_str);
$l_str = eregi_replace("\r", "", $l_str); //去失落\r
$l_str = eregi_replace("\n", "", $l_str); //去失落\n
$l_str = eregi_replace("</tr>", "\n", $l_str); //使表格的一行成为一行数据
$l_str = strip_tags($l_str, "<td>"); //只保存<td>,</td>HTML表记while(eregi("<td.+colspan", $l_str)) $l_str = fun_proc_colspan($l_str);
while(eregi("<td.+rowspan", $l_str)) $l_str = fun_proc_rowspan($l_str);
/////至此,表格处置已完成.$l_str = eregi_replace("</td>", "<br>", $l_str); //给每格之间加上标志
$l_str = strip_tags($l_str, "<br>");$l_a = explode("\n", $l_str);
for($i=0; $i<count($l_a); $i++) {
$l_str = trim($l_a[$i]);
if(empty($l_str)) continue;

$l_b = explode("<br>", $l_str);
foreach($l_b as $val) {
  echo $val." "; //表格每列内容间加空格
}
echo "<br>"; //表格的一行显示为一行
}//附测试用例和测试了局:/***********测试用表格*************************************************************<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head><body>
<table width="200" border="1" cellspacing="0" cellpadding="0">
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    <td>6</td>
    <td>7</td>
  </tr>
  <tr>
    <td>a1</td>
    <td rowspan="7">22</td>
    <td>a2</td>
    <td colspan="4">a3</td>
  </tr>
  <tr>
    <td>b1</td>
    <td colspan="2">b2</td>
    <td>b3</td>
    <td>b4</td>
    <td rowspan="4">33</td>
  </tr>
  <tr>
    <td>c1</td>
    <td>c2</td>
    <td>c3</td>
    <td>c4</td>
    <td rowspan="2">44</td>
  </tr>
  <tr>
    <td>d1</td>
    <td>d2</td>
    <td>d3</td>
    <td>d4</td>
  </tr>
  <tr>
    <td>e1</td>
    <td>e2</td>
    <td>e3</td>
    <td>e4</td>
    <td>e5</td>
  </tr>
  <tr>
    <td>f1</td>
    <td>f2</td>
    <td colspan="4">f3</td>
  </tr>
  <tr>
    <td>g1</td>
    <td colspan="5">g2</td>
  </tr>
  <tr>
    <td colspan="7">h1</td>
  </tr>
  <tr>
    <td>i1</td>
    <td colspan="3">i2</td>
    <td>i3</td>
    <td>i4</td>
    <td>i5</td>
  </tr>
  <tr>
    <td>j1</td>
    <td colspan="3">j2</td>
    <td>j3</td>
    <td colspan="2">j4</td>
  </tr>
  <tr>
    <td colspan="6">k1</td>
    <td>k2</td>
  </tr>
  <tr>
    <td colspan="6">l1</td>
    <td>l2</td>
  </tr>
  <tr>
    <td colspan="5">m1</td>
    <td>m2</td>
    <td>m3</td>
  </tr>
</table>
</body>
</html>*********************************************************************************//**************操作了局的表格***********************************************<table border='1'>
<tr>    <td>1</td>    <td>2</td>    <td>3</td>    <td>4</td>    <td>5</td>    <td>6</td>    <td>7</td> </tr>
<tr><td>a1</td>    <td ="7">22</td>    <td>a2</td>    <td ="4">a3</td>  <td>a3</td><td>a3</td><td>a3</td></tr>
<tr><td>b1</td>    <td>22</td><td ="2">b2</td>    <td>b2</td><td>b3</td>    <td>b4</td>    <td ="4">33</td>  </tr>
<tr><td>c1</td>    <td>22</td><td>c2</td>    <td>c3</td>    <td>c4</td>    <td ="2">44</td>  <td>33</td></tr>
<tr><td>d1</td>    <td>22</td><td>d2</td>    <td>d3</td>    <td>d4</td>  <td>44</td><td>33</td></tr>
<tr><td>e1</td>    <td>22</td><td>e2</td>    <td>e3</td>    <td>e4</td>    <td>e5</td>  <td>33</td></tr>
<tr><td>f1</td>    <td>22</td><td>f2</td>    <td ="4">f3</td>  <td>f3</td><td>f3</td><td>f3</td></tr>
<tr><td>g1</td>    <td>22</td><td ="5">g2</td>  <td>g2</td><td>g2</td><td>g2</td><td>g2</td></tr>
<tr><td ="7">h1</td>  <td>h1</td><td>h1</td><td>h1</td><td>h1</td><td>h1</td><td>h1</td></tr>
<tr><td>i1</td>    <td ="3">i2</td>    <td>i2</td><td>i2</td><td>i3</td>    <td>i4</td>    <td>i5</td>  </tr>
<tr><td>j1</td>    <td ="3">j2</td>    <td>j2</td><td>j2</td><td>j3</td>    <td ="2">j4</td>  <td>j4</td></tr>
<tr><td ="6">k1</td>    <td>k1</td><td>k1</td><td>k1</td><td>k1</td><td>k1</td><td>k2</td>  </tr>
<tr><td ="6">l1</td>    <td>l1</td><td>l1</td><td>l1</td><td>l1</td><td>l1</td><td>l2</td>  </tr>
<tr><td ="5">m1</td>    <td>m1</td><td>m1</td><td>m1</td><td>m1</td><td>m2</td>    <td>m3</td>  </tr>
</table>******************************************************************/   测试用表:1234567a122a2a3b1b2b3b433c1c2c3c444d1d2d3d4e1e2e3e4e5f1f2f3g1g2h1i1i2i3i4i5j1j2j3j4k1k2l1l2m1m2m3   测试了局的表:1234567a122a2a3a3a3a3b122b2b2b3b433c122c2c3c44433d122d2d3d44433e122e2e3e4e533f122f2f3f3f3f3g122g2g2g2g2g2h1h1h1h1h1h1h1i1i2i2i2i3i4i5j1j2j2j2j3j4j4k1k1k1k1k1k1k2l1l1l1l1l1l1l2m1m1m1m1m1m2m3
一下弹出N多页面!很明显,你的留言本并没有做好安全防范,被人用JS代码小小的耍了一下,我很同情你这个时候的感受,但是没有别的办法了,继续努力吧!
透明 该用户已被删除
18#
发表于 2015-7-7 18:04:49 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
若相依 该用户已被删除
17#
发表于 2015-7-7 05:06:00 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
小妖女 该用户已被删除
16#
发表于 2015-6-22 02:17:39 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
小女巫 该用户已被删除
15#
发表于 2015-6-21 16:21:00 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
admin 该用户已被删除
14#
发表于 2015-5-3 19:42:43 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
小魔女 该用户已被删除
13#
发表于 2015-5-2 18:57:55 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
冷月葬花魂 该用户已被删除
12#
发表于 2015-4-16 22:12:06 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
老尸 该用户已被删除
11#
发表于 2015-4-4 17:23:56 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
爱飞 该用户已被删除
10#
发表于 2015-4-2 22:52:48 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
9#
发表于 2015-3-24 11:26:08 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
蒙在股里 该用户已被删除
8#
发表于 2015-3-19 18:29:07 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
分手快乐 该用户已被删除
7#
发表于 2015-3-12 06:57:17 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
变相怪杰 该用户已被删除
6#
发表于 2015-3-1 14:33:59 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
海妖 该用户已被删除
5#
发表于 2015-2-17 07:53:46 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-10 23:09:14 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
简单生活 该用户已被删除
板凳
发表于 2015-2-10 02:46:10 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
再见西城 该用户已被删除
沙发
发表于 2015-2-7 16:10:06 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
莫相离 该用户已被删除
楼主
发表于 2015-2-4 07:01:57 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-11 00:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表