<?php 
/*==================================================================
	php_htmltag_braker  HTMLタグ分析用の関数ライブラリ
	-----------------------------------------------------
	by H.SAKAI ( http://quel.jp/ ) 
	-----------------------------------------------------
	※ 著作権等は、GPLに準拠します。
	※ 当スクリプトなどの利用による、いかなる損害に対しても、責任は負いません。
====================================================================

≪使い方≫
 ・php_htmltag_braker.php をインクルードしてください。
 ・各関数の使い方は、スクリプト内をご覧下さい

*/


//=========================================
// HTML分解
//---------------------------------------
// 送り値：HTML文字列
// 返り値：開始タグ、閉じタグ、テキスト部分に分けられた配列
//---------------------------------------
// ※ コメント、CSS、スクリプトは無視されます
//=========================================
function anly_html_split ( $str_html  ){
	//改行、タブ除去
		$str_html = preg_replace ("/[\t\r\n]/"," ",$str_html);
		$str_html = preg_replace ("/[\s]+/"," ",$str_html);
	//コメント除去
		$str_html = preg_replace ("/<\!\-\-.+?\-\->/","",$str_html);
		$str_html = preg_replace ("/<style .+?\/style>/i","",$str_html);
		$str_html = preg_replace ("/<script .+?\/script>/i","",$str_html);
	// 文字列を分割
		$ary_split = preg_split("/(<\/?[^>]+?>)/", $str_html,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
		$ary_split = array_diff ( $ary_split , array(" ") );
	
	return $ary_split;
}

//=========================================
// パーツ種別取得
//---------------------------------------
// 送り値：anly_html_split 関数で分解したパーツ
// 返り値：text, tag_open, tag_close
//=========================================
function anly_html_get_parts_type ( $str_entity  ){

	$str_entity_type = "text";
	if ( substr ( $str_entity , 0, 1 ) == "<" ) $str_entity_type = "tag_open";
	if ( substr ( $str_entity , 0, 2 ) == "</" ) $str_entity_type = "tag_close";
	return $str_entity_type;
}
	

//=========================================
// タグ属性値解析
//---------------------------------------
// 送り値：例_<table width="4564" >
// 返り値：属性値の連想配列、0番目はタグ名（table, img など）
//=========================================
function anly_html_get_attribute ( $str_tag  ){

	// 先頭と末尾の＜＞を除去
	$str_tag = preg_replace ("/^</" , "", $str_tag );
	$str_tag = preg_replace ("/>$/" , "", $str_tag );

	// ””囲みを先行処理　(クオート内の半角スペースを保護)
	$ary_split = preg_split("/(\"[^\"]+?\")|(\'[^\']+?\')/", $str_tag, -1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
	$str_tag ="";
	
	foreach ($ary_split as $value) {
		if ( substr ( $value , 0, 1 ) == "\"" || substr ( $value , 0, 1 ) == "'" ){
			$value = str_replace (" ","_甕拿_",$value);
		}
		$str_tag = $str_tag.$value;
	}
	
	// 属性分解
	$ary_split = explode (" ", $str_tag );
	$ary_split = array_diff ( $ary_split , array("") );//空を除去
	
	// 結果配列 $ary_result に格納
		// 0番目は、タグ名
		$ary_result[0] = $ary_split[0];
		//属性を解析
		$num_attribute = count ( $ary_split );
		for ( $i=1 ; $i < $num_attribute ; $i++ ){
			//保護した半角SPを戻す
				$value= $ary_split[$i] ;
				$value = str_replace ("_甕拿_"," ",$value);
			//属性を取り出す(=で分解)
				$ary_attribute = preg_split("/(=)/", $value ,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
			//値の処理
				if ( count($ary_attribute)== 1 ){ $ary_attribute[1] = "true";}//属性のないnowrap等は、１を格納
				$str_attribute_value="";
				for ( $j=1 ; $j< count($ary_attribute) ; $j++ ){
					$str_attribute_value = $str_attribute_value.$ary_attribute[$j] ;
				}
				$str_attribute_value = preg_replace ("/^=/" , "", $str_attribute_value);
				$str_attribute_value = preg_replace ("/^[\"\']/" , "", $str_attribute_value);
				$str_attribute_value = preg_replace ("/[\'\"]$/" , "", $str_attribute_value );
			//属性を連想配列にして、$ary_result に入れる
				$ary_result[$ary_attribute[0]] = $str_attribute_value;
		}
	return $ary_result;
}


 ?>