[PHP]XML解析器

edited 十月 2013 in 原創軟體分享區
<?php
class XML解析器 {
	static private $參照 = null;
	private $樣式 = array(
		'標籤切割' => '/(<[^>]*>)/',
		'標籤分析' => '/^<([^\s:]*)[:]?([^\s]*)([^>]*)>$/',
		'屬性切割' => "/\s+([^\s=]+)\s*=\s*((\"[^\"]*\")|('[^']*'))/",
	);
	
	private function __construct() {}
	static public function & 參照() {
		if (null === self::$參照) {
			self::$參照 = new self;
		}
		return self::$參照;
	}
	
	private function & 屬性切割(&$字串, &$終止函數 = ''){
		$輸出 = array();
		$陣列 = array();
		preg_match_all($this->樣式['屬性切割'], $字串, $陣列, PREG_SET_ORDER);
		if ('屬性切割' == $終止函數) {
			return $陣列;
		}

		foreach($陣列 as $屬性) {
			$輸出[$屬性[1]] = substr($屬性[2], 1, strlen($屬性[2]) - 2);
		}
		return $輸出;
	
	}
	
	private function & 標籤分析(&$字串){
		$輸出 = array();
		$標籤 = array();
		preg_match($this->樣式['標籤分析'], $字串, $標籤);
//		$輸出['字串'] = &$標籤[0];
		$輸出['標籤'] = &$標籤[1];
		$輸出['名稱'] = &$標籤[2];
		$輸出['屬性'] = &$標籤[3];
		$結尾 = substr($輸出['標籤'], 0, 1);
		$獨立 = substr($字串, -2, 1);

		if ('/' == $結尾) {
			$輸出['標籤'] = substr($輸出['標籤'], 1);
			$輸出['類型'] = '結尾';
		}
		if('/' == $獨立){
			$輸出['類型'] = '獨立';
		} elseif ('/' != $結尾){
			$輸出['類型'] = '開頭';
		}
		return $輸出;
	}
	
	public function & 標籤切割(&$字串, &$終止函數 = ''){
		$陣列 = preg_split($this->樣式['標籤切割'], $字串, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
		if ('標籤切割' == $終止函數) {
			return $陣列;
		}
		$輸出 = array();
		foreach ($陣列 as $索引 => $標籤) {
			if(preg_match($this->樣式['標籤切割'], $標籤)) {
				$輸出[$索引] = $this->標籤分析($標籤);
				if('標籤分析' != $終止函數){
					$輸出[$索引]['屬性'] = $this->屬性切割($輸出[$索引]['屬性'], $終止函數);
					$輸出[$索引]['內容'] = '';
				}
			} else {
				$輸出[$索引] = $標籤;
			}
		}
		return $輸出;
	}

}

function & 標籤切割($字串, $終止函數 = '') {
	$輸出 = XML解析器::參照()->標籤切割($字串, $終止函數);
	return $輸出;
}
?>

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=190

評論

Sign In or Register to comment.