这种测试写法很像python里的
if(__name__==__main__):
if(__name__==__main__):
解决方案 »
- 为什么都是觉得自己写的代码很乱
- 数据业务模型指的是什么?
- 今日下载,昨日下载,本周下载怎么实现
- 怎么用正则替换“href=a_test.php?id=45”为"45",其中45为可变数字,在线等,谢谢!
- 请问PHP怎么实现网页重定向(类似ASP的Response.Redirect方法)?
- echo 出的input 不能调用onclick事件 求高手
- 页面上的类别很多,而且有可能修改,有没有必要使用动态处理(比如从某个文件读出)?对服务器的负荷会增加很多吗?
- PHP Expert Editor2.5汉化版下载
- 有没有人对dba函数库熟?
- nginx+PHP $_SESSION丢失
- 在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();
?>