THTMLtag 这种测试写法很像python里的if(__name__==__main__): 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 冒昧修改,使结果看起来舒服点<style>body{font:12px verdana;}</style><pre><?phperror_reporting(E_ALL);class THTMLtag { /** * 类名 THTMLtag * 功能 分析传入的HTML文本,将每个节点的信息存放入$tag_list * 当打开debug开关时可以检查节点的嵌套情况 * html的注释标记<! >做为文本信息处理 **/ /** * $deep 属性,用于记录当前节点的层次 **/ var $deep = 0; /** * $tag_list 数组,用于保存分析结果 * 结构如下 * tagname 节点名 * tagdeep 节点所处层次 * tagoffs 节点在传入文本中的偏移量(位置) * tagend 节点被封闭时闭节点在结果集中的位置 * 其他元素 按节点已定义的属性开列 **/ var $tag_list = array(); /** * $debug 标志,是否处于调试状态 **/ var $debug = true; /** * 独立的标记(不需要有闭标记的标记) **/ var $onlytag = array('img','hr','br','meta','input','link'); /** * 是否优化 * 使用genHTML方法生成html时使用 **/ var $optimize = false; /** * 方法 parse * 功能 主控,拆分节点并指派 * 参数 $string 字符串,传入的HTML文本 **/ function parse($string) { $ar = preg_split("/(<\/?\w+.*?>)/si",$string, -1, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach($ar as $v) { if(preg_match("/<(\w+)(.*)(\/?)>/s",$v[0],$r)) { $tag = strtolower($r[1]); $this->_tag_begin($tag,$this->_attribs($r[2]),$v[1]); if($r[3] == '/' || in_array($tag, $this->onlytag)) $this->_tag_end($tag, $v[1]); }elseif(preg_match("/<\/(.+)>/",$v[0],$r)) $this->_tag_end(strtolower($r[1]), $v[1]); else $this->_data($v[0],$v[1]); } if($this->debug) { if($this->deep == 0) echo '没有发现错误<br>'; else { foreach($this->tag_list as $v) if(isset($v['tagend']) && $v['tagend'] == -1) printf("位于 %d 字节处的 %s 没有配对<br>\n", $v['tagoffs'], $v['tagname']); } } } /** * 内部方法 _tag_begin * 功能 当节点开始时被调用,生成并保存节点的信息到结果数组 * 参数 * $tag 字符串,节点名 * $attribs 数组,节点已定义的属性。由_attribs方法产生 * $offset 数值,节点在来源中的偏移量 **/ function _tag_begin($tag, $attribs, $offset) { $t = array('tagname' => $tag, 'tagoffs' => $offset, 'tagdeep' => $this->deep, 'tagend'=> -1, 'tagtype' => 'on'); array_push($this->tag_list, array_merge($t, $attribs)); $this->deep++; } /** * 内部方法 _tag_end * 功能 当节点关闭时被调用,调整节点层次信息 * 当debug开关打开时,进行节点嵌套检查 * 参数 * $tag 字符串,节点名 * $offset 数值,节点在来源中的偏移量 **/ function _tag_end($tag, $offset) { $this->deep--; if(in_array($tag, $this->onlytag)) { $p = count($this->tag_list)-1; $this->tag_list[$p]['tagend'] = $p; return; } $t = array('tagname' => $tag, 'tagoffs' => $offset, 'tagdeep' => $this->deep, 'tagend' => 0, 'tagtype' => 'off'); $q = $p = array_push($this->tag_list, $t); while(--$p >= 0) { $t = $this->tag_list[$p]['tagname']; if($tag == $t && $this->tag_list[$p]['tagend'] < 0) { $this->tag_list[$p]['tagend'] = $q-1; return; } } } /** * 内部方法 _data * 功能 当遇到不是节点的内容时被调用,保存内容到当前节点的tagtext元素 * 参数 $value 字符串,节点内容 **/ function _data($value, $offset) { $this->count = array_push($this->tag_list, array('tagname' => '_text', 'tagoffs' => $offset, 'tagdeep' => $this->deep, 'value' => $value)); } /** * 内部方法 _attribs * 功能 将传入的参数串转换为数组 * 参数 $string 字符串 * 返回 数组 **/ function _attribs($string) { $ar = array(); $t = split(' ',preg_replace("/ *= */",'=',$string)); $st = ''; foreach($t as $k=>$v) { $v = $st.$v; if(preg_match("/(\w+)=([\"'])(.+)\\2/s",$v,$r)) { $ar[strtolower($r[1])] = $r[3]; $st = ''; }elseif(preg_match("/\w+=[\"'].+/s",$v)) { $st = $v.' '; }elseif(preg_match("/(\w+)=([^ ]+)/s",$v,$r)) { $ar[strtolower($r[1])] = $r[2]; } } return $ar; } /** * 方法 genHTML * 功能 从分析结果中生成html文档 * 返回 字符串,生成结果 **/ function genHTML() { $retval = ''; foreach($this->tag_list as $v) { if($v['tagname'] == '_text') { if(preg_match("/[ \r\n]+$/",$v['value']) && $this->optimize) continue; $retval .= $v['value']; }else { $retval .= ($v['tagtype']=='on' ? '<' : '</').$v['tagname']; foreach($v as $key=>$value) if(substr($key, 0, 3) != 'tag') $retval .= " $key=\"".addcslashes($value, '"')."\""; $retval .= '>'; } } return $retval; }}if(basename(__FILE__) != basename($_SERVER['PHP_SELF'])) return;$tpl = <<< HTML<tablewidth=100><tr><td xxx=1",3'>1</td></tr></table><br><table><tr><td>2</td><td><table><tr><td>1</td></tr><table></td></tr></table>HTML;$o = new THTMLtag;$o->parse($tpl);print_r($o->tag_list);echo $o->genHTML();?> php调用脚本 求助php超链接的一个问题 c++做网站 我要开发中型网站了,大家建议php好书吧,最好能找到电子版的哦! 利用支付宝返回参数更新数据库 (PHP) session过期时间的问题,困惑! 用smarty的高手进来看一下 怎么样读取一个文件夹? 问个apache配置问题 关于redhat上安装apache2.0.43+php4.2.3的问题。 在PHP裡面,如何判斷一個語句是否執行成功 请问在PHP中能实现这个功能吗?(和读取远程文件有关)
body{font:12px verdana;}
</style>
<pre>
<?php
error_reporting(E_ALL);
class THTMLtag {
/**
* 类名 THTMLtag
* 功能 分析传入的HTML文本,将每个节点的信息存放入$tag_list
* 当打开debug开关时可以检查节点的嵌套情况
* html的注释标记<! >做为文本信息处理
**/
/**
* $deep 属性,用于记录当前节点的层次
**/
var $deep = 0; /**
* $tag_list 数组,用于保存分析结果
* 结构如下
* tagname 节点名
* tagdeep 节点所处层次
* tagoffs 节点在传入文本中的偏移量(位置)
* tagend 节点被封闭时闭节点在结果集中的位置
* 其他元素 按节点已定义的属性开列
**/
var $tag_list = array(); /**
* $debug 标志,是否处于调试状态
**/
var $debug = true; /**
* 独立的标记(不需要有闭标记的标记)
**/
var $onlytag = array('img','hr','br','meta','input','link'); /**
* 是否优化
* 使用genHTML方法生成html时使用
**/
var $optimize = false; /**
* 方法 parse
* 功能 主控,拆分节点并指派
* 参数 $string 字符串,传入的HTML文本
**/
function parse($string) {
$ar = preg_split("/(<\/?\w+.*?>)/si",$string, -1,
PREG_SPLIT_OFFSET_CAPTURE
| PREG_SPLIT_NO_EMPTY
| PREG_SPLIT_DELIM_CAPTURE);
foreach($ar as $v) {
if(preg_match("/<(\w+)(.*)(\/?)>/s",$v[0],$r)) {
$tag = strtolower($r[1]);
$this->_tag_begin($tag,$this->_attribs($r[2]),$v[1]);
if($r[3] == '/' || in_array($tag, $this->onlytag))
$this->_tag_end($tag, $v[1]);
}elseif(preg_match("/<\/(.+)>/",$v[0],$r))
$this->_tag_end(strtolower($r[1]), $v[1]);
else
$this->_data($v[0],$v[1]);
}
if($this->debug) {
if($this->deep == 0) echo '没有发现错误<br>';
else {
foreach($this->tag_list as $v)
if(isset($v['tagend']) && $v['tagend'] == -1)
printf("位于 %d 字节处的 %s 没有配对<br>\n", $v['tagoffs'], $v['tagname']);
}
}
} /**
* 内部方法 _tag_begin
* 功能 当节点开始时被调用,生成并保存节点的信息到结果数组
* 参数
* $tag 字符串,节点名
* $attribs 数组,节点已定义的属性。由_attribs方法产生
* $offset 数值,节点在来源中的偏移量
**/
function _tag_begin($tag, $attribs, $offset) {
$t = array('tagname' => $tag, 'tagoffs' => $offset, 'tagdeep' => $this->deep, 'tagend'=> -1, 'tagtype' => 'on');
array_push($this->tag_list, array_merge($t, $attribs));
$this->deep++;
} /**
* 内部方法 _tag_end
* 功能 当节点关闭时被调用,调整节点层次信息
* 当debug开关打开时,进行节点嵌套检查
* 参数
* $tag 字符串,节点名
* $offset 数值,节点在来源中的偏移量
**/
function _tag_end($tag, $offset) {
$this->deep--;
if(in_array($tag, $this->onlytag)) {
$p = count($this->tag_list)-1;
$this->tag_list[$p]['tagend'] = $p;
return;
}
$t = array('tagname' => $tag, 'tagoffs' => $offset, 'tagdeep' => $this->deep, 'tagend' => 0, 'tagtype' => 'off');
$q = $p = array_push($this->tag_list, $t);
while(--$p >= 0) {
$t = $this->tag_list[$p]['tagname'];
if($tag == $t && $this->tag_list[$p]['tagend'] < 0) {
$this->tag_list[$p]['tagend'] = $q-1;
return;
}
}
} /**
* 内部方法 _data
* 功能 当遇到不是节点的内容时被调用,保存内容到当前节点的tagtext元素
* 参数 $value 字符串,节点内容
**/
function _data($value, $offset) {
$this->count = array_push($this->tag_list, array('tagname' => '_text', 'tagoffs' => $offset, 'tagdeep' => $this->deep, 'value' => $value));
} /**
* 内部方法 _attribs
* 功能 将传入的参数串转换为数组
* 参数 $string 字符串
* 返回 数组
**/
function _attribs($string) {
$ar = array();
$t = split(' ',preg_replace("/ *= */",'=',$string));
$st = '';
foreach($t as $k=>$v) {
$v = $st.$v;
if(preg_match("/(\w+)=([\"'])(.+)\\2/s",$v,$r)) {
$ar[strtolower($r[1])] = $r[3];
$st = '';
}elseif(preg_match("/\w+=[\"'].+/s",$v)) {
$st = $v.' ';
}elseif(preg_match("/(\w+)=([^ ]+)/s",$v,$r)) {
$ar[strtolower($r[1])] = $r[2];
}
}
return $ar;
} /**
* 方法 genHTML
* 功能 从分析结果中生成html文档
* 返回 字符串,生成结果
**/
function genHTML() {
$retval = '';
foreach($this->tag_list as $v) {
if($v['tagname'] == '_text') {
if(preg_match("/[ \r\n]+$/",$v['value']) && $this->optimize) continue;
$retval .= $v['value'];
}else {
$retval .= ($v['tagtype']=='on' ? '<' : '</').$v['tagname'];
foreach($v as $key=>$value)
if(substr($key, 0, 3) != 'tag')
$retval .= " $key=\"".addcslashes($value, '"')."\"";
$retval .= '>';
}
}
return $retval;
}
}if(basename(__FILE__) != basename($_SERVER['PHP_SELF'])) return;$tpl = <<< HTML
<table
width=100><tr><td xxx=1",3'>1</td></tr></table><br>
<table><tr><td>2</td><td>
<table><tr><td>1</td></tr><table>
</td></tr></table>
HTML;$o = new THTMLtag;
$o->parse($tpl);
print_r($o->tag_list);
echo $o->genHTML();
?>