불당님이 원하는 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를 주는게 오히려 더 나쁘게 작용할 수도 있을거 같아요.
하루 페이지뷰 200만 정도 되는 경우, 그때마다 filter를 적용한다면
너무나 큰 overhead가 되거든요. 글쿠 filter 적용현황을 살펴보고
필터를 수정하거나 ip를 차단하거나 해야하니까요.
그래서, 굳이 resize를 포함할 필요는 없을거 같다는게 제 의견입니다.