HTML パーサー クラス

WBOY
リリース: 2016-06-21 09:05:40
オリジナル
884 人が閲覧しました

これは、HTML と XML を解析するために使用される HTML パーサー クラスです。このクラスのユニークな機能の 1 つは、innerHTML プロパティをサポートしていることです。

php

/**
* HTML/XML Parser クラス
*
* これは、HTML と XML を解析するために使用されるヘルパー クラスです。 この解析クラス
* のユニークな機能は、innerHTML のサポートが含まれていることです (これは簡単ではありません)。
*
* @author Dennis Pallett
* @copyright Dennis Pallett 2006
* @package HTML_Parser
* @version 1.0
 */

// ヘルパークラス
// HTML/XML を解析するための
クラス HTML_パーサー
{
// プライベート プロパティ
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
;

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

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

// エンティティを翻訳する
$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 = tru​​e
;
            
$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
;
}


関数
tagOpen($parser, $name, $attr
) {
// レベルを上げる
$this ->_レベル
++;

// タグを作成:
$newtag = $this->create_tag() $name, $attr
);

// タグを作成する
$tag = array("name"=>$name, "attr"=>$attr , 「レベル」=>$this->_レベル
);

// タグを追加
array_push ($this->output, $タグ
);

// このレベルにタグを追加します         $this->_tags[$this->_level] = $tag;

// HTML に追加
$this->_html .= $newtag
;

// アウトラインに追加
$this->_outline .= $this-> _レベル 。 $新しいタグ
;
}

関数
create_tag ($name, $attr
) {
// Cre食べたタグ:
# 名前から始めます
$tag = 「<」 。 ストラト下($name) 。 ' '
;

# 属性リストを作成する
foreach ($attr as $key=>$val
) {
$tag .= strto lower($key) 。 '="' . htmlentities($val) . '" '
;
}

# タグを終了
$tag = トリム($tag
);

switch(
strto lower($name
)) {
case
'br'
:
case
'input'
:
$tag .= ' /'
;
休憩;
}

        
$tag .= '>'
;

戻る
$tag
;
}

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



$this->_html .= htmlエンティティ($タグデータ
);
$this->_outline .= htmlentities($tagData
);
}

function
tagClosed($parser, $name
) {
// Add HTML およびアウトラインに変換します
switch (strto lower( $name
)) {
case
'br'
:
case
'input'
:
休憩;
デフォルト:
            
$this->_outline .= $this->_level 。 '。 ストラト下($name) 。 '>';
$this->_html .= '。 ストラト下($name) 。 '>';
}

// このエンドに属するタグを取得します
$tag = $this-> _tags[$this-> _レベル
];
$tag = $this->create_tag($tag['名前'], $tag['attr] '
]);

// innerHTML を取得してみます
$regex = '%' 。 preg_quote($this->_level . $tag, '%') 。 '(.*?)' 。 preg_quote($this->_level . '. strto lower($name ) . ', '%') 。 '%is';
preg_match
($regex, $this->_outline, $matches );


// innerHTML を取得する
if (isset(
$matches['1'
])) { $innerhtml
= $matches ['1'];
        // レベル識別子を削除します
$this->_outline = str_replace($this- >_レベル. $tag , $tag, $this->_outline
);
$this->_outline = str_replace($this->_level . '. ストラトワー($name) . '>', '. . '>' $this->_outline); // innerHTML を追加します if (isset(

$innerhtml

)) {
$this ->
出力
[
カウント( $this->output)-1]['innerhtml'] = $innerhtml; } // ツリーを修正

$this

->
output
[
count( $this->出力)- 2][「子供たち」][] = $this->output[count($this-& gt;出力)-1]; array_pop(
$this
->
output); // レベルを下げる
$this

->
_level
--; }     function
translate_entities($xmlSource, $reverse =FALSE) {
static
$リテラル2NumericEntity
;

if (empty(
$literal2NumericEntity
)) { lation_table
(HTML_ENTITIES); foreach ($transTbl
as
$char
=> $entity) { if (strpos(
'&"<>'
,
$char) !== FALSE) 続行; $literal2NumericEntity[
$]エンティティ
] =
''.ORD ($char).';'; } if ( $reverse
) { return

strtr

(
$ xmlSource
, array_flip
($literal2NumericEntity)); else { return strtr($xmlSource
,
$literal2NumericEntity
); } } } // このように 使用されます
$parser
= new

HTML_Parser

; $output
= $parser-> ;parse
(
$html
) print_r ($output);
?>

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!