Skip to content
컴퓨터잡담
2011.09.02 07:14

[php] Htmlparser.inc, Htmlparser.php Dom Paser

조회 수 5245 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부




http://sourceforge.net/projects/php-html/files/


phphtmlparser_1_0.tar.gz Htmlparser.php Htmlparser.inc


Content:

Htmlparser.inc:

<?php 

/* 
* Copyright (c) 2003 Jose Solorzano.  All rights reserved. 
* Redistribution of source must retain this copyright notice. 

* Jose Solorzano (http://jexpert.us) is a software consultant. 

* Contributions by: 
* - Leo West (performance improvements) 
*/ 

define ("NODE_TYPE_START", 0); 
define ("NODE_TYPE_ELEMENT", 1); 
define ("NODE_TYPE_ENDELEMENT", 2); 
define ("NODE_TYPE_TEXT", 3); 
define ("NODE_TYPE_COMMENT", 4); 
define ("NODE_TYPE_DONE", 5); 

/** 
* Class HtmlParser. 
* To use, create an instance of the class passing 
* HTML text. Then invoke parse() until it's false. 
* When parse() returns true, $iNodeType, $iNodeName 
* $iNodeValue and $iNodeAttributes are updated. 

* To create an HtmlParser instance you may also 
* use convenience functions HtmlParser_ForFile 
* and HtmlParser_ForURL. 
*/ 
class HtmlParser { 

    /** 
    * Field iNodeType. 
    * May be one of the NODE_TYPE_* constants above. 
    */ 
    var $iNodeType; 

    /** 
    * Field iNodeName. 
    * For elements, it's the name of the element. 
    */ 
    var $iNodeName = ""; 

    /** 
    * Field iNodeValue. 
    * For text nodes, it's the text. 
    */ 
    var $iNodeValue = ""; 

    /** 
    * Field iNodeAttributes. 
    * A string-indexed array containing attribute values 
    * of the current node. Indexes are always lowercase. 
    */ 
    var $iNodeAttributes; 

    // The following fields should be 
    // considered private: 

    var $iHtmlText; 
    var $iHtmlTextLength; 
    var $iHtmlTextIndex = 0; 
    var $iHtmlCurrentChar; 
    var $BOE_ARRAY; 
    var $B_ARRAY; 
    var $BOS_ARRAY; 
    
    /** 
    * Constructor. 
    * Constructs an HtmlParser instance with 
    * the HTML text given. 
    */ 
    function HtmlParser ($aHtmlText) { 
        $this->iHtmlText = $aHtmlText; 
        $this->iHtmlTextLength = strlen($aHtmlText); 
        $this->iNodeAttributes = array(); 
        $this->setTextIndex (0); 

        $this->BOE_ARRAY = array (" ", "\t", "\r", "\n", "=" ); 
        $this->B_ARRAY = array (" ", "\t", "\r", "\n" ); 
        $this->BOS_ARRAY = array (" ", "\t", "\r", "\n", "/" ); 
    } 

    /** 
    * Method parse. 
    * Parses the next node. Returns false only if 
    * the end of the HTML text has been reached. 
    * Updates values of iNode* fields. 
    */ 
    function parse() { 
        $text = $this->skipToElement(); 
        if ($text != "") { 
            $this->iNodeType = NODE_TYPE_TEXT; 
            $this->iNodeName = "Text"; 
            $this->iNodeValue = $text; 
            return true; 
        } 
        return $this->readTag(); 
    } 

    function clearAttributes() { 
        $this->iNodeAttributes = array(); 
    } 

    function readTag() { 
        if ($this->iCurrentChar != "<") { 
            $this->iNodeType = NODE_TYPE_DONE; 
            return false; 
        } 
        $this->clearAttributes(); 
        $this->skipMaxInTag ("<", 1); 
        if ($this->iCurrentChar == '/') { 
            $this->moveNext(); 
            $name = $this->skipToBlanksInTag(); 
            $this->iNodeType = NODE_TYPE_ENDELEMENT; 
            $this->iNodeName = $name; 
            $this->iNodeValue = "";            
            $this->skipEndOfTag(); 
            return true; 
        } 
        $name = $this->skipToBlanksOrSlashInTag(); 
        if (!$this->isValidTagIdentifier ($name)) { 
                $comment = false; 
                if (strpos($name, "!--") === 0) { 
                    $ppos = strpos($name, "--", 3); 
                    if (strpos($name, "--", 3) === (strlen($name) - 2)) { 
                        $this->iNodeType = NODE_TYPE_COMMENT; 
                        $this->iNodeName = "Comment"; 
                        $this->iNodeValue = "<" . $name . ">"; 
                        $comment = true;                        
                    } 
                    else { 
                        $rest = $this->skipToStringInTag ("-->");    
                        if ($rest != "") { 
                            $this->iNodeType = NODE_TYPE_COMMENT; 
                            $this->iNodeName = "Comment"; 
                            $this->iNodeValue = "<" . $name . $rest; 
                            $comment = true; 
                            // Already skipped end of tag 
                            return true; 
                        } 
                    } 
                } 
                if (!$comment) { 
                    $this->iNodeType = NODE_TYPE_TEXT; 
                    $this->iNodeName = "Text"; 
                    $this->iNodeValue = "<" . $name; 
                    return true; 
                } 
        } 
        else { 
                $this->iNodeType = NODE_TYPE_ELEMENT; 
                $this->iNodeValue = ""; 
                $this->iNodeName = $name; 
                while ($this->skipBlanksInTag()) { 
                    $attrName = $this->skipToBlanksOrEqualsInTag(); 
                    if ($attrName != "" && $attrName != "/") { 
                        $this->skipBlanksInTag(); 
                        if ($this->iCurrentChar == "=") { 
                            $this->skipEqualsInTag(); 
                            $this->skipBlanksInTag(); 
                            $value = $this->readValueInTag(); 
                            $this->iNodeAttributes[strtolower($attrName)] = $value; 
                        } 
                        else { 
                            $this->iNodeAttributes[strtolower($attrName)] = ""; 
                        } 
                    } 
                } 
        } 
        $this->skipEndOfTag(); 
        return true;            
    } 

    function isValidTagIdentifier ($name) { 
        return ereg ("^[A-Za-z0-9_\\-]+$", $name); 
    } 
    
    function skipBlanksInTag() { 
        return "" != ($this->skipInTag ($this->B_ARRAY)); 
    } 

    function skipToBlanksOrEqualsInTag() { 
        return $this->skipToInTag ($this->BOE_ARRAY); 
    } 

    function skipToBlanksInTag() { 
        return $this->skipToInTag ($this->B_ARRAY); 
    } 

    function skipToBlanksOrSlashInTag() { 
        return $this->skipToInTag ($this->BOS_ARRAY); 
    } 

    function skipEqualsInTag() { 
        return $this->skipMaxInTag ("=", 1); 
    } 

    function readValueInTag() { 
        $ch = $this->iCurrentChar; 
        $value = ""; 
        if ($ch == "\"") { 
            $this->skipMaxInTag ("\"", 1); 
            $value = $this->skipToInTag ("\""); 
            $this->skipMaxInTag ("\"", 1); 
        } 
        else if ($ch == "'") { 
            $this->skipMaxInTag ("'", 1); 
            $value = $this->skipToInTag ("'"); 
            $this->skipMaxInTag ("'", 1); 
        }                
        else { 
            $value = $this->skipToBlanksInTag(); 
        } 
        return $value; 
    } 

    function setTextIndex ($index) { 
        $this->iHtmlTextIndex = $index; 
        if ($index >= $this->iHtmlTextLength) { 
            $this->iCurrentChar = -1; 
        } 
        else { 
            $this->iCurrentChar = $this->iHtmlText{$index}; 
        } 
    } 

    function moveNext() { 
        if ($this->iHtmlTextIndex < $this->iHtmlTextLength) { 
            $this->setTextIndex ($this->iHtmlTextIndex + 1); 
            return true; 
        } 
        else { 
            return false; 
        } 
    } 

    function skipEndOfTag() { 
        while (($ch = $this->iCurrentChar) !== -1) { 
            if ($ch == ">") { 
                $this->moveNext(); 
                return; 
            } 
            $this->moveNext(); 
        } 
    } 

    function skipInTag ($chars) { 
        $sb = ""; 
        while (($ch = $this->iCurrentChar) !== -1) { 
            if ($ch == ">") { 
                return $sb; 
            } else { 
                $match = false; 
                for ($idx = 0; $idx < count($chars); $idx++) { 
                    if ($ch == $chars[$idx]) { 
                        $match = true; 
                        break; 
                    } 
                } 
                if (!$match) { 
                    return $sb; 
                } 
                $sb .= $ch; 
                $this->moveNext(); 
            } 
        } 
        return $sb; 
    } 

    function skipMaxInTag ($chars, $maxChars) { 
        $sb = ""; 
        $count = 0; 
        while (($ch = $this->iCurrentChar) !== -1 && $count++ < $maxChars) { 
            if ($ch == ">") { 
                return $sb; 
            } else { 
                $match = false; 
                for ($idx = 0; $idx < count($chars); $idx++) { 
                    if ($ch == $chars[$idx]) { 
                        $match = true; 
                        break; 
                    } 
                } 
                if (!$match) { 
                    return $sb; 
                } 
                $sb .= $ch; 
                $this->moveNext(); 
            } 
        } 
        return $sb; 
    } 

    function skipToInTag ($chars) { 
        $sb = ""; 
        while (($ch = $this->iCurrentChar) !== -1) { 
            $match = $ch == ">"; 
            if (!$match) { 
                for ($idx = 0; $idx < count($chars); $idx++) { 
                    if ($ch == $chars[$idx]) { 
                        $match = true; 
                        break; 
                    } 
                } 
            } 
            if ($match) { 
                return $sb; 
            } 
            $sb .= $ch; 
            $this->moveNext(); 
        } 
        return $sb; 
    } 

    function skipToElement() { 
        $sb = ""; 
        while (($ch = $this->iCurrentChar) !== -1) { 
            if ($ch == "<") { 
                return $sb; 
            } 
            $sb .= $ch; 
            $this->moveNext(); 
        } 
        return $sb;            
    } 

    /** 
    * Returns text between current position and $needle, 
    * inclusive, or "" if not found. The current index is moved to a point 
    * after the location of $needle, or not moved at all 
    * if nothing is found. 
    */ 
    function skipToStringInTag ($needle) { 
        $pos = strpos ($this->iHtmlText, $needle, $this->iHtmlTextIndex); 
        if ($pos === false) { 
            return ""; 
        } 
        $top = $pos + strlen($needle); 
        $retvalue = substr ($this->iHtmlText, $this->iHtmlTextIndex, $top - $this->iHtmlTextIndex); 
        $this->setTextIndex ($top); 
        return $retvalue; 
    } 


function HtmlParser_ForFile ($fileName) { 
    return HtmlParser_ForURL("$fileName); 


function HtmlParser_ForURL ($url) { 
    $fp = fopen ($url, "r"); 
    $content = ""; 
    while (true) { 
        $data = fread ($fp, 8192); 
        if (strlen($data) == 0) { 
            break; 
        } 
        $content .= $data; 
    } 
    fclose ($fp); 
    return new HtmlParser ($content); 


php?> 

로그인 후 댓글쓰기가 가능합니다.

?

List of Articles
번호 분류 제목 날짜 조회 수
637 WindowsTip 윈도우 8.1 종료버튼 만들기 file 2015.03.21 3851
636 WindowsTip 사용자 계정 컨트롤 화면 없애기 file 2015.03.21 3312
635 WindowsTip ISO USB 굽기 최고의 프로그램 file 2015.03.20 1903
634 자바(JAVA) 자바 애플릿 예제 2015.03.18 5648
633 Server XE 업데이트 후 모듈업데이트가 안될때 참고 file 2015.03.13 1440
632 WindowsTip Winpe 4in1 2015.03.10 1476
631 Server php.ini 파일설정으로 파일업로드 용량늘리기 2015.03.03 1152
630 Server 웹하드 서버 구축하기 2 file 2015.03.03 3278
629 WindowsTip 윈도우용 FTP 프로그램 WinSCP 2015.03.02 2139
628 WindowsTip 멀티부팅 USB 만들기 file 2015.03.01 2006
627 WindowsTip 윈도우 하드에서 설치하기 2015.02.17 2667
626 자바(JAVA) 자바(java) 설치하기 file 2015.02.13 4934
625 WindowsTip 윈도우 XP SP3 와 Windows 8.1 두가지 부팅 메뉴얼 file 2015.02.11 1768
624 [Docs]스프레드시트 Extending Google Sheets 2015.02.10 4646
623 [Docs]스프레드시트 구글 스프레드시트(Google Spreadsheet)를 데이터베이스로 활용 2015.02.10 4528
622 WindowsTip 응용 프로그램 구성 이 올바르지 않기 때문에 이 응용 프로그램 을 시작 하지 못했습니다 2015.02.06 2687
621 Excel 'C:Documents.xlsx' 을(를) 찾을 수 없습니다. 라는 오류 메시지가 나오는 경우 대처방법 2015.01.28 4789
620 WindowsTip IE 익스플로러 메뉴 바탕이 검정색으로 변했을경우 대처방법 2 2015.01.27 1644
619 AutoHotKey Autohotkey 브라우저 제어 테스트 file 2015.01.26 8204
618 컴퓨터잡담 크롬 속도올리기 2015.01.24 807
Board Pagination Prev 1 ... 13 14 15 16 17 ... 46 Next
/ 46

http://urin79.com

우린친구블로그

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소