불당님이 원하는 resize문제를 HTMLFilter로 구현해보았습니다. > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

불당님이 원하는 resize문제를 HTMLFilter로 구현해보았습니다. 정보

불당님이 원하는 resize문제를 HTMLFilter로 구현해보았습니다.

본문

먼저 구현을 위해 register_function()이란 함수를 만들었습니다. 그리고 다음과 같이 테스트해보았습니다. (현재의 버젼에는 없습니다.)

// 클래스 등록
include 'HTMLFilter.php';
$filter = new HTMLFilter();

// 변환할 예제
$html = "<img src=\"sir.co.kr/logo.gif\" width=700px height='600px'> <img src=http://sir.co.kr/logo.gif width=0 height=0>";

// for testing
// user function
// 형식은 $tagname, $attrname, $attrval 그리고 함수가 각각 불러지기 때문에 데이터를 공유할 global 변수가 필요합니다. 함수내에 global 선언으로 해도 되나 글로벌 파라미터를 등록하는 것도 가능하게 했습니다.
function myFunction($tagname, $attrname, $attrval, $param)
{
// 초기화
 if (!$param['flag']) {
  $param['flag'] = true;
  $param['change'] = false;
  $param['width'] = 0;
 }

// 태그가 img일 때
 if ($tagname == 'img') {
// 여기서는 예제로 width를 500으로 주었습니다. 그래서 500 이상의 width를 가진다면 500으로 줄입니다.
// 그누에서는 $board[bo_image_width]로 하면 되겠죠...
  if ($attrname == 'width' && intval($attrval) > 500) {
   $param['width'] = $attrval;
   $attrval = 500;
// 함수가 각각 실행되기 때문에 글로벌 변수가 필요해서 $param을 이용한 겁니다. $param[change]는 flag가 되는거죠.
   $param['change'] = true;
  }
// width가 500 이상이라면 500으로 맞추었기 때문에 당연히 height도 비율이 변해야 겠죠.
  if ($param['change'] && $attrname == 'height') {
   $attrval = floor($attrval*500/$param['width']);
  }
// width나 height가 0값이라면 제거를 합니다.
// $attrval값을 false로 놓으면 속성 이름과 함께 제거가 됩니다.
  if (($attrname == 'width' || $attrname == 'height') && intval($attrval) == 0) {
   $attrval = false;
  }
 }
}
// 그리고 함수를 등록합니다. 함수는 여러개 등록이 가능합니다. 그리고 각 함수마다 위에서 예제에서 보듯이 4번째 변수는 global 변수입니다.
$filter->register_function('myFunction');

// 그럼 filtering 결과를 보아야 겠죠?
echo htmlspecialchars($filter->parse($html));

그럼 결과는 어떻게 나올까요? 이렇게 나옵니다...
<img src="sir.co.kr/logo.gif" width="500" height="428" /> <img src="//sir.kr/logo.gif" />

원하는대로 나왔죠? register_function()함수에 대해 더 생각해보고 더 좋은 방법이 있다면 수정을 해보고 HTMLFilter를 업데이트 하겠습니다.

댓글 전체

내용이 너무 철학적이라 잘 모르겠네요. ㅠ..ㅠ...

매번 view를 할 때마다 filter를 호출하는 것은 속도문제 때문에 현실적으로 어렵습니다.
filter를 하는 것은 쓰기를 할때나 처음 view를 할 때로 제한을 해야 하는 것이 아닌가요?

1. security filter : 보안을 위한 것 (xss, csrf ...)

                        filter에 걸리는 경우원본은 별도 테이블에 저장하고 수정본으로 대치
                        저장상황을 보고 누가 hacking을 시도하는지 확인 및 대응이 가능

2. content filter : view를 위한 것 (resize, thumbnail, image 또는 contents 가져가는거 막기 ...)

글쿠 width만 주면 height는 알아서 비율대로 나오던데요??? 소숫점까지 정확하게 줄수가
없기 때문에, height를 주는게 오히려 더 나쁘게 작용할 수도 있을거 같아요.
예... 저는 security filter는 write_update.php에 넣어버리려구요.
하루 페이지뷰 200만 정도 되는 경우, 그때마다 filter를 적용한다면
너무나 큰 overhead가 되거든요. 글쿠 filter 적용현황을 살펴보고
필터를 수정하거나 ip를 차단하거나 해야하니까요.

그래서, 굳이 resize를 포함할 필요는 없을거 같다는게 제 의견입니다.
전체 135,051
십년전오늘 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT