这几天一直在研究史努比的采集程序,完成百度文档的采集和下载附件。
其中,需要对HTML进行DOM模型操作,读取表单中数组的Value,所以我在网上查找了一些类,发现了两个类:HTMLSQL和DOMDocument。 功能比较齐全,可惜没有我想要的。 功效,所以我决定自己开发。
我想补充一些我自己的看法。 我是在离开上海后的最后三天写这篇文章的。 恐怕要到明年才能看到成品了。 希望这次回去不要太贪玩了。 嘎嘎。
首先,需要实现类似Javascript的操作,例如document.getElementById和document.getElementByNamephp 采集类,它们分别返回一个HTML元素对象和一个链表。 唯一的 HTML 元素可以使用该对象来输出 HTML 参数和值。
下面给出了代码片段。
[php]
/*获取指定ID的HTML元素*/
函数getElementById($Value)
$this->__getElement($URI,'id',$Value);
if(is_array($this->结果)&&count($this->结果)>0)
$this->结果=array_shift($this->结果);
$this->结果=$this->__ElementToObj($this->结果);
/*获取指定名称的HTML元素*/
函数 getElementByName($Value)
return$this->__getElement('name',$Value);
/*获取指定标签的HTML元素*/
函数getElementByTag($TAG='')
$结果=$这个->结果;
if($TAG)$TAG="($TAG)";
否则$TAG='[az]+';
preg_match_all("@]*?>@isU",$结果,$Elements);
$this->元素=$Elements[0];
returncount($Elements[0]);
/*获取富含单个属性或值的 HTML 元素*/
function__getElement($ELE,$value=NULL)
if(!$this->getElementByTag()){
返回假;
}else$Elements=$this->元素;
$ELE=爆炸('|',$ELE);
foreach($ELEas$E)
$this->__matchElement($Elements,$E,$value);
排序($元素);
返回$元素;
function__matchElement(&$Elements,$E,$value=NULL)
if($value!==NULL)$value="["'s]*?{$value}["'s]*?"";
否则$值='';
if(is_array($Elements))
foreach($Elementsas$key=>$html)
if(!preg_match("@s{$E}={$value}@is",$html))unset($Elements[$key]);
}别的{
if(!preg_match("@s{$E}={$value}@is",$Elements))unset($Elements);
返回$元素;
函数__ElementToObj($Elements)
if(is_array($Elements))
foreach($Elementsas$key=>$E)
$Elements[$key]=$this->__ElementToObj($E);
}别的{
preg_match_all("@s([az]+)=["']*?([^"']*?)["']*?@isU",$Elements,$Obj);
$Elements=newstdClass();
foreach($Obj[1]as$key=>$value)
$Elements->$Obj[1][$key]=$Obj[2][$key];
返回$元素;
[/php]
使用方法也比较简单。
[php]
$this=getElementById('thisid');
$this->title;//输出标题
$this->value;//输出值
[/php]
基础工作已经完成php 采集类,接下来会进行一些扩展,我们计划添加以下功能。
连贯操作
类似于Jquery的节点选择器功能。
我们先来说一下什么是相干函数。 PHP类的连贯操作在一个方法之后直接调用同级别的另一个方法。 我们习惯称其为一致套接字。 在ThinkPHP2.0中,这种方法非常常用,逻辑清晰,效率也比较高。 最重要的是,我觉得这个功能非常酷......
至于连续性套接字,则没有那么难理解。 简单地说,它将结果返回给类本身,并且该类可以执行其他允许的方法。 想要入门的人可以阅读这篇文章:
说到这里,可以做一个演示。 在 html 页面中,有一个包含多个字段和不同值的表单。 我们来演示一下获取这个值的操作过程。
[php]html->表单->输入->名称->值[/php]
根据DOM模型的路径,我们可以定位到我们需要的元素和参数值。 这里的选择过程和Query的选择器很相似,这里只是简单模拟了一个过程。
[php]
$obj=form(array('name'=>'testname','class'=>'testclass'))
//如果有多个Form,可以使用链表来缩小选择范围。
->input('name'=>'username')//获取域名
->select();//转换为链表或对象
[/php]
实现了基于Dom模型的选择过程。 当根据 HTML 元素类型进行选择时,直接根据元素名称进行选择。 考虑到您可能无法在类中编写很多 HTML 元素,因此可以使用 __call 方法将该方法转移到另一个操作中。
喜欢:
[php]$this->form(array('name'=>'testname','class'=>'testclass'))[/php]
被重定向到其他操作并将数据返回到$this->results,从而更容易以其他方式或以连贯的方式调用。
[php]$this->getElement('form',array('name'=>'testname','class'=>'testclass'))[/php]
这样,即使根据DOM模型进行节点选择的功能规划完成了,返回后的工作就是建立流程、选择并逻辑处理HTML元素,敬请期待。