function mysubstr( $str, $length ){ $tagcnt = 0; $charcnt = 0; $tag = ''; $maxlen = strlen( $str ); $resultstr = ''; $tagstack = array(); for( $i = 0; $i < $length; $i++ ){ if( $str[$i] == '<' ){ $resultstr .= $str[$i]; for( $j=$i; $str[$j]!='>'; $j++,$length++ ){ $tag .= $str[$j]; } $tagcnt++; $length++; $tag .= '>'; //如果是開始標記,則入棧,如果是與之相對應的結束標記則出棧 if( preg_match('/<([^/]+)?>/i', $tag, $r) ){ echo '入棧:',htmlspecialchars($r[1]),'<br />'; array_push($tagstack, $r[1]); } elseif( preg_match( '/'.$tagstack[count($tagstack)-1].'/', $tag ) ){ echo '出棧:',htmlspecialchars($tagstack[count($tagstack)-1]),'<br />'; array_pop( $tagstack ); } $tag = ''; continue; } $charcnt++; $resultstr .= $str[$i]; } echo '<hr size=1>最後結果為:'; //棧是空的直接返回 if(empty($tagstack)){ return $resultstr; } //否則去掉沒有結束標記的開始標記 else{ while(!empty($tagstack)){ $tag = array_pop($tagstack); $index = strrpos($resultstr, $tag); for($i = $index-1; $resultstr[$i] != '>'; $i++ ){ $resultstr[$i] = ''; } $resultstr[$i++] = ''; } return $resultstr; } } $sttime = microtime(true); $stmem = memory_get_usage(); $str = "a1<body>b2<p>c3<em>d4</em>e5</p>f6</body>g7h8"; echo '處理結果為:<br/><hr size=1>',htmlspecialchars( mysubstr( $str, 18 ) ),'<br />'; echo "記憶體使用量情況:",(memory_get_usage()-$stmem),'<br />'; echo "演算法已耗用時間(microtime):",(microtime(true)-$sttime),'<br/>'; |