これは、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 = 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;
}
関数 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); ?>