사이트 내 전체검색
PHP
[php] HTML 태그 정리하는 프로그램
로빈아빠
https://cmd.kr/php/495 URL이 복사되었습니다.

본문

HTML 태그 정리하는 프로그램

http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=37483

안녕하세요.

디자이너분들이 작성하신 HTML 태그를
프로그래머가 알아보기 쉽게 정렬해주는 프로그램입니다.

PHPer님들의 따끔한 지적 기다리겠습니다.
감사합니다.

<?
##### 기본 변수를 설정한다. #####
// 모든 입력값은 현재 파일이 존재하는 디렉토리를 기준을 입력한다.

$source_dir_name = "Source"; // 원본 파일의 디렉토리 명을 기입한다.
$target_dir_name = "Result"; // 변환 후 저장될 디렉토리 명을 기입한다.

$code_enter = "\r\n"; // 엔터코드 값을 입력한다.
$code_enter2 = "\r\n\r\n"; // 엔터코드 2줄 값.
$code_tab = "\t"; // 탭코드 값을 입력한다.
// $code_space = ""; // 스페이스코드 값을 입력한다.

$upper_char = false; // 대문자로 변환 (true | false)
$explain = true; // 주석문 사용 여부 (true | false)
$coma = false; // 쌍따옴표를 홋따옴표로 변경한다. (true | false)
?>

<html>
<head>
<title>Tag Arrager</title>

<link rel='stylesheet' type='text/css' href='style_admin_default.css'>
<style>
<!--
.list_title td {padding-left:10px; padding-right:10px}
//-->
</style>

</head>
<body>

<table width=100% height=100% border=0>
<tr height=40><td align=center style='font-size:14px; font-weight:bold'>{ 변환된 각 파일에 대한 정보 출력 }</td></tr>
<tr>
    <td valign=top align=center>

    <table border=1>
    <tr class=list_title>
        <td>파일명</td>
        <td>&lt;TABLE&gt;</td>
        <td>&lt;TR&gt;</td>
        <td>&lt;TD&gt;</td>
    </tr>

    <?
    ##### 마이크로 타임을 구하는 함수 #####
    function get_microtime($mode="") {

        if(!$now_time) {$now_time = microtime();}        
        $microtime = explode(" ", $now_time);

        switch($mode) {
            case "" :
            case "sum" : // 초와 마이크로초를 합해서 반환
                $result = $microtime[1] + $microtime[0];
                break;

            case "micro" : // 마이크로초만 반환
                $result = $microtime[0];
                break;
        }

        return $result;

    }

    
    ##### 프로그램 처리 시간을 계산하기 위한 초기값 설정 #####    
    $start_time = get_microtime();


    ##### 폴더의 파일 수 만큼 반복한다. #####
    $not_file = array(".", ".."); // 작업 대상 제외 파일
    $open_dir = opendir($source_dir_name);
    while($source_file_name = readdir($open_dir)) {

        if(!in_array($source_file_name, $not_file)) {

            ##### 파일을 배열변수(줄단위) 형태로 가져온다. #####        
            $source = file($source_dir_name . "/" . $source_file_name);
            $source_counter = sizeof($source);

            $table_depth = 0; // 테이블 깊이를 초기화 한다.
            unset($table_counter_array); // 테이블 카운터 배열을 초기화 한다.

            ##### 치환 부분 #####
            for($i = 0; $i < $source_counter; $i++) {

                $now_record = $source[$i];

                ##### 스크립트 시작 시점을 확인한다. #####
                if(eregi("(<script)", $now_record)) {$script_line = 1;}
                if(eregi("(<style)", $now_record)) {$style_line = 1;}

                ##### 각줄의 앞뒤 공백을 제거한다. #####
                $line_check = $script_line + $style_line;

                ##### 공백을 제거한다. #####
                if(!$line_check) {$now_record = trim($now_record);}
                else {$now_record = rtrim($now_record);}

                ##### 공백줄이 아니라면 타겟 배열변수에 입력한다. #####
                if($now_record) {

                    ##### 테이블 테그의 깊이값을 체크한다. #####
                    if(eregi("(<table)", $now_record)) {
                        $table_depth++;
                        $table_counter_array[$table_depth]++;
                    } // end IF

                    $table_counter = $table_counter_array[$table_depth];

                    ##### <td><table> 형태와 </table></td> 형태의 뭉쳐진 테이블 태그를 분리한다. #####
                    $now_record = eregi_replace(">( )*<table", ">$code_enter<table", $now_record);
                    $now_record = eregi_replace(">( )*</table>( )*<", ">$code_enter</table>$code_enter<", $now_record);
                    $now_record = eregi_replace("</table>", "</table>" . $code_enter, $now_record);

                    ##### <tr><td> 형태와 </td></tr> 형태의 뭉쳐진 테이블 태그를 분리한다. #####
                    $now_record = eregi_replace(">( )*</tr", ">$code_enter</tr", $now_record);
                    $now_record = eregi_replace(">( )*<td", ">$code_enter<td", $now_record);
                    $now_record = eregi_replace(">( )*</td", ">$code_enter</td", $now_record);

                    ##### 기존 태그를 다른 형태의 같은 효과 태그로 변환 한다. #####
                    $now_record = eregi_replace("(<strong>)", "<b>", $now_record);
                    $now_record = eregi_replace("(</strong>)", "</b>", $now_record);

                    ##### 기본 태그를 정렬한다. #####
                    $now_record = eregi_replace("(<script|<style)", $code_enter2 . "\\1", $now_record);
                    $now_record = eregi_replace("(</script>|</style>)", "\\1" . $code_enter2, $now_record);

                    $now_record = eregi_replace("(<table|<form|<body)", $code_enter . "\\1", $now_record);
                    $now_record = eregi_replace("(</table>|</form>|</body>)", "\\1" . $code_enter, $now_record);

                    ##### 주석문을 추가한다. #####
                    if($explain) {
                        $now_record = eregi_replace("(<table)", "<!-- 테이블 No. $table_depth-$table_counter [시작] Depth : $table_depth -->$code_enter\\1", $now_record);
                        $now_record = eregi_replace("(</table>)", "\\1$code_enter<!-- 테이블 No. $table_depth-$table_counter [끝] Depth : $table_depth -->", $now_record);
                        $now_record = eregi_replace("(<script)", "<!-- 스크립트 [시작] -->$code_enter\\1", $now_record);
                        $now_record = eregi_replace("(</script>)", "\\1$code_enter<!-- 스크립트 [끝] -->", $now_record);
                        $now_record = eregi_replace("(<style)", "<!-- 스타일 [시작] -->$code_enter\\1", $now_record);
                        $now_record = eregi_replace("(</style>)", "\\1$code_enter<!-- 스타일 [끝] -->", $now_record);
                        $now_record = eregi_replace("(<form)", "<!-- 입력폼 [시작] -->$code_enter\\1", $now_record);
                        $now_record = eregi_replace("(</form>)", "\\1$code_enter<!-- 입력폼 [끝] -->", $now_record);
                        $now_record = eregi_replace("(<input|<textarea|<select)", "<!-- 입력 -->\\1", $now_record);
                    }

                    ##### 결과값을 배열에 저장한다. #####
                    $target[] = $now_record;
                    
                    ##### 테이블 테그의 깊이값을 체크한다. #####
                    if(eregi("(</table>)", $now_record)) {$table_depth--;}

                    ##### 테이블 테그의 오류 체크를 위한 처리 #####
                    if(eregi("(<table)", $now_record)) {$table_tag[table]++;}
                    if(eregi("(</table>)", $now_record)) {$table_tag[table]--;}
                    if(eregi("(<tr)", $now_record)) {$table_tag[tr]++;}
                    if(eregi("(</tr>)", $now_record)) {$table_tag[tr]--;}
                    if(eregi("(<td)", $now_record)) {$table_tag[td]++;}
                    if(eregi("(</td>)", $now_record)) {$table_tag[td]--;}

                    ##### 스크립트 종료 시점을 확인한다. #####
                    if(eregi("(</script>)", $now_record)) {$script_line = 0;}
                    if(eregi("(</style>)", $now_record)) {$style_line = 0;}

                } // end IF
                
            } // end F


            ##### 정리된 태그들을 하나의 변수로 저장한뒤, 엔터코드 값으로 분리해준다. ##### // 중간 중간 삽입된 엔터코드를 분리하기 위해서임.
            $source_implode = implode($code_enter, $target);
            $source = explode($code_enter, $source_implode);

            unset($target); // 타켓 변수를 제거한다.
        
            $source_counter = sizeof($source);
            $tab_counter = 1; // 탭 카운트를 초기화 한다.

            for($i = 0; $i < $source_counter; $i++) {

                $now_record = $source[$i];

                ##### 스크립트 시작 시점을 확인한다. #####
                if(eregi("(<script)", $now_record)) {$script_line = 1;}
                if(eregi("(<style)", $now_record)) {$style_line = 1;}

                ##### 각줄의 앞뒤 공백을 제거한다. #####
                $line_check = $script_line + $style_line;

                ##### 공백을 제거한다. #####
                if(!$line_check) {$now_record = trim($now_record);}
                else {$now_record = rtrim($now_record);}

                if($now_record) {

                    ##### 탭 간격을 설정한다. ##### // 테이블 태그와 스크립트 태그를 포함하면 탭을 증가한다.
                    if(eregi("(<td)", $now_record)) {$tab_counter++;}

                    ##### 탭의 수만큼 줄 앞에 탭을 추가한다. #####
                    if(!$line_check) {
                        for($j = 1; $j < $tab_counter; $j++) {$now_record = $code_tab . $now_record;}                    
                    }

                    $target[] = $now_record;

                    if(eregi("(</td)", $now_record)) {$tab_counter--;}                    

                } else {$target[] = "";}    // end IF

                ##### 스크립트 종료 시점을 확인한다. #####
                if(eregi("(</script>)", $now_record)) {$script_line = 0;}
                if(eregi("(</style>)", $now_record)) {$style_line = 0;}

            } // end F

            $target_implode = implode($code_enter, $target); // 배열에서 일반 변수로 모아준다.


            ##### 대문자 변환처리를 한다. #####
            if($upper_char) {

                $target_implode = eregi_replace("(<script)", "<SCRIPT", $target_implode);
                $target_implode = eregi_replace("(</script>)", "</SCRIPT>", $target_implode);
                $target_implode = eregi_replace("(<style)", "<STYLE", $target_implode);
                $target_implode = eregi_replace("(</style>)", "</STYLE>", $target_implode);

                $target_implode = eregi_replace("(<body)", "<BODY", $target_implode);
                $target_implode = eregi_replace("(</body>)", "</BODY>", $target_implode);
                $target_implode = eregi_replace("(<table)", "<TABLE", $target_implode);
                $target_implode = eregi_replace("(</table>)", "</TABLE>", $target_implode);    
                $target_implode = eregi_replace("(<form)", "<FORM", $target_implode);
                $target_implode = eregi_replace("(</form>)", "</FORM>", $target_implode);

                $target_implode = eregi_replace("(<tr)", "<TR", $target_implode);
                $target_implode = eregi_replace("(</tr>)", "</TR>", $target_implode);
                $target_implode = eregi_replace("(<td)", "<TD", $target_implode);
                $target_implode = eregi_replace("(</td>)", "</TD>", $target_implode);
                
                $target_implode = eregi_replace("(<input)", "<INPUT", $target_implode);
                $target_implode = eregi_replace("(<textarea)", "<TEXTAREA", $target_implode);
                $target_implode = eregi_replace("(</textarea>)", "</TEXTAREA>", $target_implode);
                $target_implode = eregi_replace("(<select)", "<SELECT", $target_implode);
                $target_implode = eregi_replace("(</select>)", "</SELECT>", $target_implode);

            } // end IF


            ##### 쌍따옴표를 홋따옴표로 변경한다. #####
            if($coma) {
                $target_implode = eregi_replace("\"", "'", $target_implode);
            } // end IF


            ##### 완성된 내용을 파일로 저장한다. #####
            $write_file = fopen($target_dir_name . "/" . $source_file_name, w); // 파일을 저장 형태로 열어준다.

            if(!fwrite($write_file, $target_implode)) {
                echo "변환된 완성 파일 저장에 실패했습니다.";
                exit;
            } // end IF
            fclose($write_file);

            ##### 배열변수를 초기화 시킨다 #####
            unset($source);
            unset($target);

            ##### 리포트 출력 #####
            foreach($table_tag as $key => $value) {
                if($value) {$table_tag[$key] = "<font color=red>" . $value . "</font>";}
            } // end FE

            echo "
            <tr class=list_items>
                <td style='padding-left:10px; padding-right:10px'>$source_file_name</td>
                <td>$table_tag[table]</td>
                <td>$table_tag[tr]</td>
                <td>$table_tag[td]</td>
            </tr>";

            unset($table_tag);

        } // end IF

    } // end W
    closedir($open_dir);

    ##### 프로그램 처리 시간을 계산한다. #####
    $process_time = round(get_microtime() - $start_time, 3);
    ?>

    </table>

    <table style='margin-top:10px'>
    <tr>
        <td>
        ※ 값이 0 이면 정상.<br>
        ※ 값이 양수이면 끝 태그가 부족한 경우.<br>
        ※ 값이 음수이면 시작 태그가 부족한 경우.<br><br>

        프로그램 처리 시간: <?=$process_time?>초
        </td>
    </tr>
    </table>

    </td>
</tr>
</table>

</body>
</html>

댓글목록

등록된 댓글이 없습니다.

PHP
871 (10/18P)

Search

Copyright © Cmd 명령어 3.144.4.54