[펌]게시판 contents에서 table태그 잘못사용시 깨짐방지

게시판에 내용에 악의 적으로든 고의 적으로든 table을 잘못 열고 닫아
테이블 베치가 엉망이 되는 경우를 생각해서 한번 만들어봤습니다.
팁이라고 하긴 뭐하나 -_- 그래도 올려봅니다.

function stripos($txt,$q )
{
return strpos(strtolower($txt),strtolower($q));
}

function html_check($str_p)
{
$stack = array(“html”); // stack에 array배열을 생성하기위해 그냥 하나 넣어줌
array_pop($stack); //그냥 넣은거 뺌 -_-;

$str=$str_p;
$start_tag_num=substr_count(strtolower(trim($str)),”<table”); //<table 갯수를 샘
$end_tag_num=substr_count(strtolower(trim($str)),”</table>”); // </table>갯수를 샘

$i=$start_tag_num+$end_tag_num; // 두개를 더한 갯수만큼만 루프를 돔 because? 당연히 태그갯수만큼만 검사를 하면 되지.

while($i>0)
{

$open_table=stripos($str,”<table”); //<table을 찾고 포인터를 반환 못찾으면 false반환
$close_table=stripos($str,”</table”); //위와 같음

if($open_table < $close_table && $open_table!==false || ($open_table!==false && $close_table===false))
// &&뒤의 내용은 만약 open_table이 false일 경우 당연히 close_table보다 값이 작으므로 의도하지 않은 행동을 한다.
// 그 행동을 방지 하기 위해 && 뒤의 내용을 추가하는 것도 있고
// 2번째는 비교문에서 false와 0(stripos로 부터 돌려받은 0번째지점포인터)는 0=0으로 취급한다.
// 그러므로 false(찾기 실패)와 0(0번째에서 찾음)을 구분하기 위해서 && 뒤에 로직이 있다.
{
$str=substr($str,$open_table,strlen($str) – $open_table); // 찾은 포인터부터 문자열끝까지 str에 저장한다.
$str=substr($str,stripos($str,”>”)+1,strlen($str) – (stripos($str,”>”)+1)); // 찾은 포인터부터 문자열끝까지 str에 저장한다.
array_push($stack,”table”); //테이블 테그를 찾았으므로 스택에 넣음
}
else if(($open_table > $close_table && $close_table!==false) || ($open_table===false && $close_table!==false))
{
$str=substr($str,$close_table,strlen($str) – $close_table); // 찾은 포인터부터 문자열끝까지 str에 저장한다.
$str=substr($str,stripos($str,”>”)+1,strlen($str) – (stripos($str,”>”)+1)); // 찾은 포인터부터 문자열끝까지 str에 저장한다.

if(!array_pop($stack)) //만약 스택에 “table”이 없는경우에는 <table>없이 </table>태그를 사용한 경우므로
$plus_front_str= “<table>” . $plus_front_str; //문자열 앞쪽에 <table>을 연다.

}

$i–;
}

while($tag=array_pop($stack)) //만약 스택에 table이 남아 있다면 </table>로 제대로 닫아 주지 않았는것이므로
{
$plus_end_str= $plus_end_str . “</table>”; // 문자열 뒷쪽에 </table>을 추가함으로써 닫아준다.
}

echo “<br>테그가 잘목되었습니다 앞에다음과 같은 문장을 추가해야합니다 :<br>” . htmlspecialchars($plus_front_str);
echo “<br>테그가 잘목되었습니다 뒤에다음과 같은 문장을 추가해야합니다 :<br>” . htmlspecialchars($plus_end_str);

$str_p=$plus_front_str .$str_p .$plus_end_str;
return $str_p;

}

$r_str=html_check(“<table><tr><td><font>후후후후</font><td><tr></table>1ta</table>2tab</table><table><table>”);
echo(“<br>변환된 코드:”. htmlspecialchars($r_str));

출력결과는

테그가 잘목되었습니다 앞에다음과 같은 문장을 추가해야합니다 :
<table><table>
테그가 잘목되었습니다 뒤에다음과 같은 문장을 추가해야합니다 :
</table></table>
변환된 코드:<table><table><table><tr><td><font>후후후후</font><td><tr></table>1ta</table>2tab</table><table><table></table></table>

입니다. 순서에 맞게 모두 처리 됐습니다.

흠 근데 문제가 있습니다. 저렇게 처리해주어도 -_-태그디자인이 좀 깨지더군요.

안일그러지게 할수는 없을까요?

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다