仓酷云

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

[学习教程] PHP编程:Html Parser Class

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
在这里想谈谈自己这六个多月的PHP学习心得,希望对给比我还新的新手们有所帮助,讲的不是很深刻,甚至有的想法可能是错误的,希望不要误导新人才好,大家要有自己的主见。   This is a HTML parser class, used to parse HTML and XML. One of the unique features of this class is that it supports the innerHTML property. <?php

/**
* HTML/XML Parser Class
*
* This is a helper class that is used to parse HTML and XML. A unique feature of this parsing class  
* is the fact that it includes support for innerHTML (which isn't easy to do).
*
* @author Dennis Pallett
* @copyright Dennis Pallett 2006
* @package HTML_Parser
* @version 1.0
*/

// Helper Class
// To parse HTML/XML
Class HTML_Parser
{
   
// Private properties
   
var $_parser
;
    var
$_tags
= array();
    var
$_html
;
    var
$output
= array();
    var
$strXmlData
;
    var
$_level = 0
;
    var
$_outline
;
    var
$_tagcount
= array();
    var
$xml_error = false
;
    var
$xml_error_code
;
    var
$xml_error_string
;
    var
$xml_error_line_number
;

    function
get_html
() {
        return
$this->_html
;
    }

    function
parse($strInputXML
) {
        
$this->output
= array();

        
// Translate entities
        
$strInputXML = $this->translate_entities($strInputXML
);

        
$this->_parser = xml_parser_create
();
        
xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, true
);
        
xml_set_object($this->_parser,$this
);
        
xml_set_element_handler($this->_parser, "tagOpen", "tagClosed"
);
           
        
xml_set_character_data_handler($this->_parser, "tagData"
);
      
        
$this->strXmlData = xml_parse($this->_parser,$strInputXML
);

        if (!
$this->strXmlData
) {
            
$this->xml_error = true
;
            
$this->xml_error_code = xml_get_error_code($this->_parser
);
            
$this->xml_error_string = xml_error_string(xml_get_error_code($this->_parser
));
            
$this->xml_error_line_number =  xml_get_current_line_number($this->_parser
);
            return
false
;
        }

        return
$this->output
;
    }


    function
tagOpen($parser, $name, $attr
) {
        
// Increase level
        
$this->_level
++;

        
// Create tag:
        
$newtag = $this->create_tag($name, $attr
);

        
// Build tag
        
$tag = array("name"=>$name,"attr"=>$attr, "level"=>$this->_level
);

        
// Add tag
        
array_push ($this->output, $tag
);

        
// Add tag to this level
        
$this->_tags[$this->_level] = $tag
;

        
// Add to HTML
        
$this->_html .= $newtag
;

        
// Add to outline
        
$this->_outline .= $this->_level . $newtag
;
    }

    function
create_tag ($name, $attr
) {
        
// Create tag:
        # Begin with name
        
$tag = '<' . strtolower($name) . ' '
;

        
# Create attribute list
        
foreach ($attr as $key=>$val
) {
            
$tag .= strtolower($key) . '="' . htmlentities($val) . '" '
;
        }

        
# Finish tag
        
$tag = trim($tag
);
         
        switch(
strtolower($name
)) {
            case
'br'
:
            case
'input'
:
               
$tag .= ' /'
;
            break;
        }

        
$tag .= '>'
;

        return
$tag
;
    }

    function
tagData($parser, $tagData
) {
        if(
trim($tagData
)) {
            if(isset(
$this->output[count($this->output)-1]['tagData'
])) {
               
$this->output[count($this->output)-1]['tagData'] .= $tagData
;
            } else {
               
$this->output[count($this->output)-1]['tagData'] = $tagData
;
            }
        }

        
$this->_html .= htmlentities($tagData
);
        
$this->_outline .= htmlentities($tagData
);
    }
   
    function
tagClosed($parser, $name
) {
        
// Add to HTML and outline
        
switch (strtolower($name
)) {
            case
'br'
:
            case
'input'
:
                break;
            default:
            
$this->_outline .= $this->_level . '</' . strtolower($name) . '>'
;
            
$this->_html .= '</' . strtolower($name) . '>'
;
        }

        
// Get tag that belongs to this end
        
$tag = $this->_tags[$this->_level
];
        
$tag = $this->create_tag($tag['name'], $tag['attr'
]);

        
// Try to get innerHTML
        
$regex = '%' . preg_quote($this->_level . $tag, '%') . '(.*?)' . preg_quote($this->_level . '</' . strtolower($name) . '>', '%') . '%is'
;
        
preg_match ($regex, $this->_outline, $matches
);

        
// Get innerHTML
        
if (isset($matches['1'
])) {
            
$innerhtml = $matches['1'
];
        }
         
        
// Remove level identifiers
        
$this->_outline = str_replace($this->_level . $tag, $tag, $this->_outline
);
        
$this->_outline = str_replace($this->_level . '</' . strtolower($name) . '>', '</' . strtolower($name) . '>', $this->_outline
);

        
// Add innerHTML
        
if (isset($innerhtml
)) {
            
$this->output[count($this->output)-1]['innerhtml'] = $innerhtml
;
        }

        
// Fix tree
        
$this->output[count($this->output)-2]['children'][] = $this->output[count($this->output)-1
];
        
array_pop($this->output
);

        
// Decrease level
        
$this->_level
--;
    }

    function
translate_entities($xmlSource, $reverse =FALSE
) {
        static
$literal2NumericEntity
;
         
        if (empty(
$literal2NumericEntity
)) {
            
$transTbl = get_html_translation_table(HTML_ENTITIES
);

            foreach (
$transTbl as $char => $entity
) {
                if (
strpos('&"<>', $char) !== FALSE
) continue;
                    
$literal2NumericEntity[$entity] = '&#'.ord($char).';'
;
                }
            }

            if (
$reverse
) {
                return
strtr($xmlSource, array_flip($literal2NumericEntity
));
            } else {
                return
strtr($xmlSource, $literal2NumericEntity
);
            }
      }
}

// To be used like this
$parser = new HTML_Parser
;
$output = $parser->parse($html
);

print_r ($output
);

?>

因为函数实在是太多了,慢慢的你就会知道,知道有这个函数就可以。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-2-4 09:48:47 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
再现理想 该用户已被删除
板凳
发表于 2015-2-5 16:59:25 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
admin 该用户已被删除
地板
发表于 2015-2-7 03:45:37 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
第二个灵魂 该用户已被删除
5#
发表于 2015-2-9 07:54:23 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
小女巫 该用户已被删除
6#
发表于 2015-2-10 02:34:07 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
金色的骷髅 该用户已被删除
7#
发表于 2015-2-11 09:01:36 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
不帅 该用户已被删除
8#
发表于 2015-2-20 14:15:13 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
谁可相欹 该用户已被删除
9#
发表于 2015-2-26 09:39:21 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
飘灵儿 该用户已被删除
10#
发表于 2015-3-8 13:12:41 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
柔情似水 该用户已被删除
11#
发表于 2015-3-11 04:00:03 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
爱飞 该用户已被删除
12#
发表于 2015-3-17 20:08:17 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
精灵巫婆 该用户已被删除
13#
发表于 2015-3-24 23:12:51 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
莫相离 该用户已被删除
14#
发表于 2015-3-26 12:05:35 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
小妖女 该用户已被删除
15#
发表于 2015-3-29 00:31:05 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
若天明 该用户已被删除
16#
发表于 2015-4-5 04:49:53 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
分手快乐 该用户已被删除
17#
发表于 2015-4-6 00:09:52 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
简单生活 该用户已被删除
18#
发表于 2015-4-16 19:09:15 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
海妖 该用户已被删除
19#
发表于 2015-4-16 23:11:33 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
变相怪杰 该用户已被删除
20#
发表于 2015-4-17 12:43:38 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-7 10:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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