活着的死人 发表于 2015-2-4 00:10:19

PHP编程:Html Parser Class

在这里想谈谈自己这六个多月的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 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

第二个灵魂 发表于 2015-2-9 07:54:23

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

小女巫 发表于 2015-2-10 02:34:07

php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)

金色的骷髅 发表于 2015-2-11 09:01:36

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

不帅 发表于 2015-2-20 14:15:13

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

谁可相欹 发表于 2015-2-26 09:39:21

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

飘灵儿 发表于 2015-3-8 13:12:41

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

柔情似水 发表于 2015-3-11 04:00:03

对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。

爱飞 发表于 2015-3-17 20:08:17

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

精灵巫婆 发表于 2015-3-24 23:12:51

学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。

莫相离 发表于 2015-3-26 12:05:35

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

小妖女 发表于 2015-3-29 00:31:05

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

若天明 发表于 2015-4-5 04:49:53

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

分手快乐 发表于 2015-4-6 00:09:52

如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,

简单生活 发表于 2015-4-16 19:09:15

首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。

海妖 发表于 2015-4-16 23:11:33

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

变相怪杰 发表于 2015-4-17 12:43:38

学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
页: [1] 2
查看完整版本: PHP编程:Html Parser Class