내용에있는 링크를 배열로 만들기 질문입니다 정보
내용에있는 링크를 배열로 만들기 질문입니다관련링크
본문
국가고시(?)합격 기념으로 쌩둥맞은 스킨을 만들고 있습니다.^^
우선은 리스트에서 내용($list[$i][wr_content])에 뒤섞여있는 여러 이미지 링크에서 첫번째 나오는 이미지 파일주소만 변수에 담고자 합니다.
예를들면 본문 내용이 아래와 같을경우,
---------------------------------------------------------
<BR>지난 5월 모내기가 한창일 때 찾았던 대장동 마을을 오랫만에 다시 둘러보았다.<BR><BR><IMG src="http://bucheonlife.com/2006/0608aug/daejang0060.JPG" border=3><BR><BR><IMG src="http://bucheonlife.com/2006/0608aug/daejang0058.JPG" border=3><BR><BR>그동안 쑥쑥 자란 벼는푸른 줄기마다 실한 이삭을 한아름씩 안고 서있었고, 부쩍 높아진 하늘에는 잠자리들이 이리저리 날아다녔다. 유난히도 길었던 장마와 그 끝을 알수 없을 만큼 맹위를 떨쳤던 무더위도 자연의 섭리는 막을수 없었던듯 가을을 재촉하는 바람에 저만치 밀려나 있었고, 누렇게 익어가는 호박이며 아직은 푸른 껍질속에서 영글어가는 밤송이, 탱글탱글 살이 오른 대추가 저마다 가을이 오고 있음을 알리고 있었다.~~~
---------------------------------------------------------
본문을 모두 긁지않고 처음 나타나는 <img src=~~~ 부터 닫힘태그 > 까지 가져오거나,
http로 시작되는 모든 링크를 각 wr_id별로 배열로 만들고 그중에서 첫번째 이미지링크를 뽑아써야 할것 같은데 막연합니다.
현재 아래처럼 링크1에 걸린 이미지를 쓰는 방법으로 해보는데 이방법이 불필요한 링크를 남기는것 같아 개선해보고자 합니다.
//----------------------------------------------------------------
$sql = mysql_query(" select wr_link1 from " . $write_table . " where wr_id = '" . $wr_id . "' ");
$results = mysql_fetch_array($sql);
$url = $results['wr_link1'];
$save_dir = $lt_path;//임시 저장경로
$referer = "";//속일 리퍼러, 넣지 않아도 됨
$size = Ygetimagesize($url, $save_dir, $referer);
//링크에서 파일명 가져옴
$filename = strrchr($url,"/");
$filename = substr($filename, 1);//??
$filename = urlencode($filename); //공백파일명등 썸네일 생성 확인
$dest_file = $lt_path . '/' . $filename;
//----------------------------------------------------------------
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $filename) && file_exists($dest_file)){
~~
조언 부탁드립니다.^^
우선은 리스트에서 내용($list[$i][wr_content])에 뒤섞여있는 여러 이미지 링크에서 첫번째 나오는 이미지 파일주소만 변수에 담고자 합니다.
예를들면 본문 내용이 아래와 같을경우,
---------------------------------------------------------
<BR>지난 5월 모내기가 한창일 때 찾았던 대장동 마을을 오랫만에 다시 둘러보았다.<BR><BR><IMG src="http://bucheonlife.com/2006/0608aug/daejang0060.JPG" border=3><BR><BR><IMG src="http://bucheonlife.com/2006/0608aug/daejang0058.JPG" border=3><BR><BR>그동안 쑥쑥 자란 벼는푸른 줄기마다 실한 이삭을 한아름씩 안고 서있었고, 부쩍 높아진 하늘에는 잠자리들이 이리저리 날아다녔다. 유난히도 길었던 장마와 그 끝을 알수 없을 만큼 맹위를 떨쳤던 무더위도 자연의 섭리는 막을수 없었던듯 가을을 재촉하는 바람에 저만치 밀려나 있었고, 누렇게 익어가는 호박이며 아직은 푸른 껍질속에서 영글어가는 밤송이, 탱글탱글 살이 오른 대추가 저마다 가을이 오고 있음을 알리고 있었다.~~~
---------------------------------------------------------
본문을 모두 긁지않고 처음 나타나는 <img src=~~~ 부터 닫힘태그 > 까지 가져오거나,
http로 시작되는 모든 링크를 각 wr_id별로 배열로 만들고 그중에서 첫번째 이미지링크를 뽑아써야 할것 같은데 막연합니다.
현재 아래처럼 링크1에 걸린 이미지를 쓰는 방법으로 해보는데 이방법이 불필요한 링크를 남기는것 같아 개선해보고자 합니다.
//----------------------------------------------------------------
$sql = mysql_query(" select wr_link1 from " . $write_table . " where wr_id = '" . $wr_id . "' ");
$results = mysql_fetch_array($sql);
$url = $results['wr_link1'];
$save_dir = $lt_path;//임시 저장경로
$referer = "";//속일 리퍼러, 넣지 않아도 됨
$size = Ygetimagesize($url, $save_dir, $referer);
//링크에서 파일명 가져옴
$filename = strrchr($url,"/");
$filename = substr($filename, 1);//??
$filename = urlencode($filename); //공백파일명등 썸네일 생성 확인
$dest_file = $lt_path . '/' . $filename;
//----------------------------------------------------------------
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $filename) && file_exists($dest_file)){
~~
조언 부탁드립니다.^^
댓글 전체

내용의 이미지를 배열로 만드는것을 말씀하시는 거라면
view.skin.php 에 아래 내용을 삽입해 보세요
<?
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
$imgs = extract_img($view[wr_content]);
echo "<pre>";
var_dump($imgs);
echo "</pre>";
?>
참고:
http://sir.co.kr/bbs/tb.php/g4_tiptech/3643/3dfe715631fb5ba85696c8c0c783c77a
view.skin.php 에 아래 내용을 삽입해 보세요
<?
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
$imgs = extract_img($view[wr_content]);
echo "<pre>";
var_dump($imgs);
echo "</pre>";
?>
참고:
http://sir.co.kr/bbs/tb.php/g4_tiptech/3643/3dfe715631fb5ba85696c8c0c783c77a
답변 감사합니다.
우선 본문의 예제는 업데이트 스킨에서 처리되는 점을 말씀드리지 않았군요.
현재 링크1번에 타 계정의 이미지를 링크하고 그 이미지에 대한 썸네일 생성후,
리스트에서 첨부파일1번 썸네일과 위 생성된 썸네일 이미지를 우선순위를 두어 목록에 보여주고있습니다.
링크1번 썸네일 생성은 업데이트 스킨에서 처리하고 또한 별도의 썸네일 일괄 생성파일을 만들어 두었습니다.
-----------------
우선 당장은 $url 변수에 링크1번 이미지가 아닌 내용에있는 첫번째 이미지링크를 사용하는 방법을 찾는 정도이고,
-----------------
나아가서는 내용에 있는 링크를 모두 배열에 담아 좀더 유연하게 활용하고자 하는점입니다.
ps)
알려주신 링크에 function extract_img 부분을 연구해보면 도움이 될것 같습니다.
삽질을 좀더 해보고 막히면 여쭙겠습니다.^^
우선 본문의 예제는 업데이트 스킨에서 처리되는 점을 말씀드리지 않았군요.
현재 링크1번에 타 계정의 이미지를 링크하고 그 이미지에 대한 썸네일 생성후,
리스트에서 첨부파일1번 썸네일과 위 생성된 썸네일 이미지를 우선순위를 두어 목록에 보여주고있습니다.
링크1번 썸네일 생성은 업데이트 스킨에서 처리하고 또한 별도의 썸네일 일괄 생성파일을 만들어 두었습니다.
-----------------
우선 당장은 $url 변수에 링크1번 이미지가 아닌 내용에있는 첫번째 이미지링크를 사용하는 방법을 찾는 정도이고,
-----------------
나아가서는 내용에 있는 링크를 모두 배열에 담아 좀더 유연하게 활용하고자 하는점입니다.
ps)
알려주신 링크에 function extract_img 부분을 연구해보면 도움이 될것 같습니다.
삽질을 좀더 해보고 막히면 여쭙겠습니다.^^
너무나 좋은 아이디어 입니다.
cheditor로 글을 쓸 때... 그림이나 링크를 많이 올리게 되죠.
그것들을 별도의 DB에 보관해서 보여줄 수 있다면?
사이트에 올라오는 그림과 url을 모아서 보는 것... 진짜 재미있겠네요.
GOOOOOOOO~!! 입니다.
cheditor로 글을 쓸 때... 그림이나 링크를 많이 올리게 되죠.
그것들을 별도의 DB에 보관해서 보여줄 수 있다면?
사이트에 올라오는 그림과 url을 모아서 보는 것... 진짜 재미있겠네요.
GOOOOOOOO~!! 입니다.

친절한 서기님거 응용하면 되겟네요
오랬만에 뵙겠습니다.^^
새해 무궁발전을 기원합니다.
이번 삽질은 유창화님의 팁가운데 소켓으로 타계정의 이미지 정보를 가져오는 부분에서 부터 출발했습니다.
썸네일 생성후 원본은 삭제하고 생성된 썸네일을 활용하려는 목적입니다.
링크1에 걸린 이미지로 테스트는 마친상태인데, 링크에 의미없는 별도의 이미지를 일일이 거는것보다 본문내용에서 첫번째 링크된 이미지를 활용하는것이 좋을것 같아 수정해보고 있습니다.
아래는 유창화님께서 올려주셨던 팁을 응용해서 만든 겟방식의 일괄적용 파일 내용입니다.
- 대부분 동작하는듯 한데, 레코드가 2천개 정도에 레코드당 평균 수십개의 이미지가 링크된 게시판에서 이녀석이 동작을 포기하는듯 합니다. 나누어서 처리하는 방법이 있으면 좋겠네요,^^
아래 별도의 코멘트에 소스를 붙입니다. 보시고 조언해주시면 고맙겠습니다.
비슷한 개념으로 업데이트나 리스트페이지, 뷰페이지에서 적용해보고 있는 내용입니다.
새해 무궁발전을 기원합니다.
이번 삽질은 유창화님의 팁가운데 소켓으로 타계정의 이미지 정보를 가져오는 부분에서 부터 출발했습니다.
썸네일 생성후 원본은 삭제하고 생성된 썸네일을 활용하려는 목적입니다.
링크1에 걸린 이미지로 테스트는 마친상태인데, 링크에 의미없는 별도의 이미지를 일일이 거는것보다 본문내용에서 첫번째 링크된 이미지를 활용하는것이 좋을것 같아 수정해보고 있습니다.
아래는 유창화님께서 올려주셨던 팁을 응용해서 만든 겟방식의 일괄적용 파일 내용입니다.
- 대부분 동작하는듯 한데, 레코드가 2천개 정도에 레코드당 평균 수십개의 이미지가 링크된 게시판에서 이녀석이 동작을 포기하는듯 합니다. 나누어서 처리하는 방법이 있으면 좋겠네요,^^
아래 별도의 코멘트에 소스를 붙입니다. 보시고 조언해주시면 고맙겠습니다.
비슷한 개념으로 업데이트나 리스트페이지, 뷰페이지에서 적용해보고 있는 내용입니다.
겟방식으로 호출해서 사용하는 게시판별 일괄 썸네일 생성 전체내용입니다.
<?php
//링크썸네일 파일을 재설정을 위한 소스코드 - 유창화님 코드 응용 2007년 1월 21일 일요일 - 플록
//실행되는 동안 종료 되지 않도록 사용메모리와 실행가능 시간을 늘려준다.
@set_time_limit (0);
@ini_set ("memory_limit", "20M");
//겟으로 넘어온것만 받아서 처리
$g4_path = '../../..';//상대경로지정
$bo_table = $_GET['bo_table'];
$data_path = $g4_path . "/data/file/" . $bo_table;
$lt_path = $data_path . "/lt_file";
$thumb_path = $data_path . "/thumb";
if (!is_dir($lt_path)) {
@mkdir($lt_path, 0707);
@chmod($lt_path, 0707);
}
if (!is_dir($thumb_path)) {
@mkdir($thumb_path, 0707);
@chmod($thumb_path, 0707);
}
//$bo_table 이 넘어오지 않으면 스크립트 종료
if (empty($bo_table)) exit;
include_once($g4_path . "/_common.php");
if ($is_admin != "super") alert("최고관리자만 접근 가능합니다.");
//링크된 이미지 썸네일 생성 테스트
//유창화님 코드
//변수가 정의 되었으면 해당 값을 반환하고 정의 되어있지 않으면 지정된 기본값을 반환합니다.
function Yvar_check(&$var, $return=''){
return (isset($var)) ? $var : $return;
}
//변수가 정의되지 않았거나 값이 NULL값 이거나, 값이 0, false 일경우 지정된 기본값을 반환합니다.
function Yvar_empty_check(&$var, $return=''){
return (!empty($var)) ? $var : $return;
}
function Ygetimagesize($url, $save_dir, $referer=''){
$array = parse_url($url);
$url_scheme = Yvar_check($array['scheme']);
$url_server = Yvar_check($array['host']);
$url_path = Yvar_check($array['path']);
$url_query= Yvar_check($array['query']);
$url_port = Yvar_empty_check($array['port'], 80);
//$save_file = $save_dir . preg_replace("`^.+(\.[^.]+)$`", '/' . uniqid("") . "\\1", $array['path']);
//$s_file = preg_replace("`^.+(\.[^.]+)$`", uniqid("") . "\\1", $array['path']);
$filename = strrchr($array['path'],"/");
$filename = substr($filename, 1);
$save_file = $save_dir . '/' . $filename;
//echo $filename;
$fp = fsockopen($url_server, $url_port);
if (empty($fp)) {
//echo "error-http소켓접속에 실패하였습니다.";
return Array();//배열만 생성해서 리턴
}
fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
fputs($fp, "Accept: */*\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\n");
fputs($fp, "Host: $url_server:$url_port\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Cache-control: private\n");
fputs($fp, "Pragma: no-cache\n");
fputs($fp, "Connection: close\n\n");
$text = '';
$check_header = false;
while (!feof($fp)){
$temp = fgets($fp, 1024);
if ($check_header == false){
//실제 파일이 아닌 헤더 정보인지 체크 하여 추가하지 않는다.
if (preg_match("'^(\r)?\n$'", $temp)) {
$check_header = true;
continue;
}
}
else{
//헤더 정보가 아닌 경우에만 추가한다.
$text .= $temp;
}
}
fclose($fp);
$fp = @fopen ($save_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($save_file, 0777);
$size = @getimagesize($save_file);
//@unlink($save_file);//썸네일 생성후 업데이트에서 수행
return $size;
}
//----------------------------------------------------------------
$sql = " select * from " . $g4['write_prefix'] . $bo_table . " ";
if (!empty($wr_id)){//레코드별로 처리할 경우를 위해 추가
$sql .= " where wr_id = '" . $wr_id . "' ";
}
$results = sql_query($sql);
//친절한 서기님 코드
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
for ($i=0; $row=sql_fetch_array($results); $i++) {
$imgs = extract_img($row['wr_content']);
$url = $imgs[0];//첫번째 링크된 이미지
//$url = $row['wr_link1'];//링크1 사용
$save_dir = $lt_path;//임시 저장경로
$referer = "";//속일 리퍼러, 넣지 않아도 됨
if (!empty($url)){
$size = Ygetimagesize($url, $save_dir, $referer);
//링크에서 파일명 가져옴
$filename = strrchr($url,"/");
$filename = substr($filename, 1);
$filename = urlencode($filename); //공백파일명등 썸네일 생성 확인
$dest_file = $lt_path . '/' . $filename;
//----------------------------------------------------------------
//$filename = $list[$i]['file'][0]['file']; //첫번째 이미지 파일로 지정
//$dest_file = $data_path .'/'. $filename;//원본 이미지
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $filename) && file_exists($dest_file)){
$thumb = $thumb_path.'/' . $filename;
if (!file_exists($thumb)) {
$size = getimagesize($dest_file);
if ($size[2] == 1)
$src = imagecreatefromgif($dest_file);
else if ($size[2] == 2)
$src = imagecreatefromjpeg($dest_file);
else if ($size[2] == 3)
$src = imagecreatefrompng($dest_file);
else
break;
if ($size[0] >= $size[1]) {
$rate = $board[bo_1] / $size[0];
$width = $board[bo_1];
$height = (int)($size[1] * $rate);
}
else {
$rate = $board[bo_1] / $size[1];
$width = (int)($size[0] * $rate);
$height = $board[bo_1];
}
$dst = imagecreatetruecolor($width, $height);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagejpeg($dst, $thumb, $board['bo_2']);
chmod($thumb, 0707);
@unlink($dest_file);//가져온 임시파일 삭제
echo $width . "*" . $height . " - " . $thumb . "<br>";
}
}
}
}
echo "링크썸네일 파일을 재설정 완료 하였습니다.";
?><a href="javascript:parent.window.close();"> 창닫기</a>
<?php
//링크썸네일 파일을 재설정을 위한 소스코드 - 유창화님 코드 응용 2007년 1월 21일 일요일 - 플록
//실행되는 동안 종료 되지 않도록 사용메모리와 실행가능 시간을 늘려준다.
@set_time_limit (0);
@ini_set ("memory_limit", "20M");
//겟으로 넘어온것만 받아서 처리
$g4_path = '../../..';//상대경로지정
$bo_table = $_GET['bo_table'];
$data_path = $g4_path . "/data/file/" . $bo_table;
$lt_path = $data_path . "/lt_file";
$thumb_path = $data_path . "/thumb";
if (!is_dir($lt_path)) {
@mkdir($lt_path, 0707);
@chmod($lt_path, 0707);
}
if (!is_dir($thumb_path)) {
@mkdir($thumb_path, 0707);
@chmod($thumb_path, 0707);
}
//$bo_table 이 넘어오지 않으면 스크립트 종료
if (empty($bo_table)) exit;
include_once($g4_path . "/_common.php");
if ($is_admin != "super") alert("최고관리자만 접근 가능합니다.");
//링크된 이미지 썸네일 생성 테스트
//유창화님 코드
//변수가 정의 되었으면 해당 값을 반환하고 정의 되어있지 않으면 지정된 기본값을 반환합니다.
function Yvar_check(&$var, $return=''){
return (isset($var)) ? $var : $return;
}
//변수가 정의되지 않았거나 값이 NULL값 이거나, 값이 0, false 일경우 지정된 기본값을 반환합니다.
function Yvar_empty_check(&$var, $return=''){
return (!empty($var)) ? $var : $return;
}
function Ygetimagesize($url, $save_dir, $referer=''){
$array = parse_url($url);
$url_scheme = Yvar_check($array['scheme']);
$url_server = Yvar_check($array['host']);
$url_path = Yvar_check($array['path']);
$url_query= Yvar_check($array['query']);
$url_port = Yvar_empty_check($array['port'], 80);
//$save_file = $save_dir . preg_replace("`^.+(\.[^.]+)$`", '/' . uniqid("") . "\\1", $array['path']);
//$s_file = preg_replace("`^.+(\.[^.]+)$`", uniqid("") . "\\1", $array['path']);
$filename = strrchr($array['path'],"/");
$filename = substr($filename, 1);
$save_file = $save_dir . '/' . $filename;
//echo $filename;
$fp = fsockopen($url_server, $url_port);
if (empty($fp)) {
//echo "error-http소켓접속에 실패하였습니다.";
return Array();//배열만 생성해서 리턴
}
fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
fputs($fp, "Accept: */*\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\n");
fputs($fp, "Host: $url_server:$url_port\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Cache-control: private\n");
fputs($fp, "Pragma: no-cache\n");
fputs($fp, "Connection: close\n\n");
$text = '';
$check_header = false;
while (!feof($fp)){
$temp = fgets($fp, 1024);
if ($check_header == false){
//실제 파일이 아닌 헤더 정보인지 체크 하여 추가하지 않는다.
if (preg_match("'^(\r)?\n$'", $temp)) {
$check_header = true;
continue;
}
}
else{
//헤더 정보가 아닌 경우에만 추가한다.
$text .= $temp;
}
}
fclose($fp);
$fp = @fopen ($save_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($save_file, 0777);
$size = @getimagesize($save_file);
//@unlink($save_file);//썸네일 생성후 업데이트에서 수행
return $size;
}
//----------------------------------------------------------------
$sql = " select * from " . $g4['write_prefix'] . $bo_table . " ";
if (!empty($wr_id)){//레코드별로 처리할 경우를 위해 추가
$sql .= " where wr_id = '" . $wr_id . "' ";
}
$results = sql_query($sql);
//친절한 서기님 코드
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
for ($i=0; $row=sql_fetch_array($results); $i++) {
$imgs = extract_img($row['wr_content']);
$url = $imgs[0];//첫번째 링크된 이미지
//$url = $row['wr_link1'];//링크1 사용
$save_dir = $lt_path;//임시 저장경로
$referer = "";//속일 리퍼러, 넣지 않아도 됨
if (!empty($url)){
$size = Ygetimagesize($url, $save_dir, $referer);
//링크에서 파일명 가져옴
$filename = strrchr($url,"/");
$filename = substr($filename, 1);
$filename = urlencode($filename); //공백파일명등 썸네일 생성 확인
$dest_file = $lt_path . '/' . $filename;
//----------------------------------------------------------------
//$filename = $list[$i]['file'][0]['file']; //첫번째 이미지 파일로 지정
//$dest_file = $data_path .'/'. $filename;//원본 이미지
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $filename) && file_exists($dest_file)){
$thumb = $thumb_path.'/' . $filename;
if (!file_exists($thumb)) {
$size = getimagesize($dest_file);
if ($size[2] == 1)
$src = imagecreatefromgif($dest_file);
else if ($size[2] == 2)
$src = imagecreatefromjpeg($dest_file);
else if ($size[2] == 3)
$src = imagecreatefrompng($dest_file);
else
break;
if ($size[0] >= $size[1]) {
$rate = $board[bo_1] / $size[0];
$width = $board[bo_1];
$height = (int)($size[1] * $rate);
}
else {
$rate = $board[bo_1] / $size[1];
$width = (int)($size[0] * $rate);
$height = $board[bo_1];
}
$dst = imagecreatetruecolor($width, $height);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagejpeg($dst, $thumb, $board['bo_2']);
chmod($thumb, 0707);
@unlink($dest_file);//가져온 임시파일 삭제
echo $width . "*" . $height . " - " . $thumb . "<br>";
}
}
}
}
echo "링크썸네일 파일을 재설정 완료 하였습니다.";
?><a href="javascript:parent.window.close();"> 창닫기</a>

음
그렇게 하실려면
인서트 되거나 업데이트 될때에 처리하셔야 겠군요.
해당 스킨의 $board_skin_path/write_update.tail.skin.php
에서 처리하는게 좋아보이는군요.
//내용에서 ://를 포함한 이미지url 한개만 뽑아옴, 공통처리
preg_match("`<\s*img\s+src\s*=\s*['"]?([^'"\s]+://[^'"\s]+\.(gif|jpe?g|png))['"]?\s*[^>]+`i", $wr_content, $images);
if (!empty($images[1])) { //본문에 이미지 있음
if ($w == 'u') {//업데이트 일경우
//여분 필드에 저장되어있는 값과 새로 뽑은 이미지 리스트를 비교한다.
$old_images = $wr_10;
//저장된 이미지와 새로 가져온 이미지가 다를경우만 처리
if ($old_images != $images[1]) {
썸네일을 만드는 과정을 진행하고
테이블에 $wr_10 의값을 $images[1] 로 업데이트 한다.
}
}
else {//인서트일경우, 답변 포함
썸네일을 만드는 과정을 진행하고
테이블에 $wr_10 의값을 $images[1] 로 업데이트 한다.
}
}
else { //본문에 이미지 없음, 업데이트만 처리
if ($w == 'u') {//업데이트 일경우
//여분 필드에 저장되어있는 값과 새로 뽑은 이미지 리스트를 비교한다.
$old_images = $wr_10;
//저장된 이미지가 존재하면
if (!empty($old_images)) {
기존 썸네일을 삭제하고
테이블에 $wr_10 의값을 '' 로 업데이트 한다.
}
}
}
//리스트 스킨에서 보여줄땐
여분필드 $wr_10을 뽑아서
존재하면 해당 이미지를 출력
없으면 업로드된 파일을 보여주면 됩니다.
썸네일을 만들때 저장하는 이름은
뽑아온 이미지url을 그대로 urlencode해서 저장하는게 좋겠습니다.
그렇게 하실려면
인서트 되거나 업데이트 될때에 처리하셔야 겠군요.
해당 스킨의 $board_skin_path/write_update.tail.skin.php
에서 처리하는게 좋아보이는군요.
//내용에서 ://를 포함한 이미지url 한개만 뽑아옴, 공통처리
preg_match("`<\s*img\s+src\s*=\s*['"]?([^'"\s]+://[^'"\s]+\.(gif|jpe?g|png))['"]?\s*[^>]+`i", $wr_content, $images);
if (!empty($images[1])) { //본문에 이미지 있음
if ($w == 'u') {//업데이트 일경우
//여분 필드에 저장되어있는 값과 새로 뽑은 이미지 리스트를 비교한다.
$old_images = $wr_10;
//저장된 이미지와 새로 가져온 이미지가 다를경우만 처리
if ($old_images != $images[1]) {
썸네일을 만드는 과정을 진행하고
테이블에 $wr_10 의값을 $images[1] 로 업데이트 한다.
}
}
else {//인서트일경우, 답변 포함
썸네일을 만드는 과정을 진행하고
테이블에 $wr_10 의값을 $images[1] 로 업데이트 한다.
}
}
else { //본문에 이미지 없음, 업데이트만 처리
if ($w == 'u') {//업데이트 일경우
//여분 필드에 저장되어있는 값과 새로 뽑은 이미지 리스트를 비교한다.
$old_images = $wr_10;
//저장된 이미지가 존재하면
if (!empty($old_images)) {
기존 썸네일을 삭제하고
테이블에 $wr_10 의값을 '' 로 업데이트 한다.
}
}
}
//리스트 스킨에서 보여줄땐
여분필드 $wr_10을 뽑아서
존재하면 해당 이미지를 출력
없으면 업로드된 파일을 보여주면 됩니다.
썸네일을 만들때 저장하는 이름은
뽑아온 이미지url을 그대로 urlencode해서 저장하는게 좋겠습니다.
감사합니다.
기존의 테스트에서 처리시간이나 업데이트의 경우 때문에 부심하고 있었는데,
답글을 보니 감이 잡히는것 같습니다.^^
조언해주신대로 삽질 해보고 결과를 보고드리겠습니다.
편안한밤 되십시오^^
기존의 테스트에서 처리시간이나 업데이트의 경우 때문에 부심하고 있었는데,
답글을 보니 감이 잡히는것 같습니다.^^
조언해주신대로 삽질 해보고 결과를 보고드리겠습니다.
편안한밤 되십시오^^
하루종일 편집을 못할 정도로 회선상태가 좋지않아 이제야 테스트해보았습니다.
유창화님께서 알려주신 구문대로 작성해보니 업데이트에서 정지한후 넘기질 못합니다.
업데이트에서 정지할 경우 에러내용을 보는 방법을 몰라서 나름대로 재작성해보았습니다.
미결사항으로는 올려주신 `첫번째 이미지 파일을 찾는 문자열 처리방법`을 적용하면 src이전에 속성을 준경우 통과되는점이 있습니다.
최초 디비인서트까지 잘됩니다만, `이미지정보 변경없이 글을 수정할경우 디비에서 정보가 삭제`되는데 이 부분은 제능력으로는 수정이 어렵네요.ㅠㅠ
현재는 여분필드를 사용하지않고 생성된 썸네일경로를 지정해주는 방식으로 돌아는 가는듯 합니다만, 관련해서 어떤 문제가 있을런지요?
다음과 같이 write_update.tail.skin.php 작성해서 테스트해보았습니다.
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
//실행되는 동안 종료 되지 않도록 사용메모리와 실행가능 시간을 늘려준다. 유창화님
@set_time_limit (0);
@ini_set ("memory_limit", "20M");
//----------------------------------------------------------------
//링크된 이미지 썸네일 생성 테스트 - 유창화님 코드 응용, 2007년 1월 21일 일요일
//링크1번의 이미지 파일에 대한 썸네일 이미지 생성후 원본파일은 삭제합니다.
//생성된 썸네일 이미지는 리스트에 목록화 합니다.
//타 계정 이미지 파일을 링크할수 밖에 없는 상황에서 인덱싱을 위한 썸네일만을 만들기위해..
//변수가 정의 되었으면 해당 값을 반환하고 정의 되어있지 않으면 지정된 기본값을 반환합니다.
function Yvar_check(&$var, $return=''){
return (isset($var)) ? $var : $return;
}
//변수가 정의되지 않았거나 값이 NULL값 이거나, 값이 0, false 일경우 지정된 기본값을 반환합니다.
function Yvar_empty_check(&$var, $return=''){
return (!empty($var)) ? $var : $return;
}
function Ygetimagesize($url, $save_dir, $referer=''){
$array = parse_url($url);
$url_scheme = Yvar_check($array['scheme']);
$url_server = Yvar_check($array['host']);
$url_path = Yvar_check($array['path']);
$url_query= Yvar_check($array['query']);
$url_port = Yvar_empty_check($array['port'], 80);
//$save_file = $save_dir . preg_replace("`^.+(\.[^.]+)$`", '/' . uniqid("") . "\\1", $array['path']);
//원본 파일명을 그대로 사용합니다.
$filename = strrchr($array['path'],"/");
$filename = substr($filename, 1);
$save_file = $save_dir . '/' . $filename;
$fp = fsockopen($url_server, $url_port);
if (empty($fp)){
//echo "error-http소켓접속에 실패하였습니다.";
return Array();//배열만 생성해서 리턴
}
fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
fputs($fp, "Accept: */*\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\n");
fputs($fp, "Host: $url_server:$url_port\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Cache-control: private\n");
fputs($fp, "Pragma: no-cache\n");
fputs($fp, "Connection: close\n\n");
$text = '';
$check_header = false;
while (!feof($fp)){
$temp = fgets($fp, 1024);
if ($check_header == false){
//실제 파일이 아닌 헤더 정보인지 체크 하여 추가하지 않는다.
if (preg_match("'^(\r)?\n$'", $temp)){
$check_header = true;
continue;
}
}
else{
//헤더 정보가 아닌 경우에만 추가한다.
$text .= $temp;
}
}
fclose($fp);
$fp = @fopen ($save_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($save_file, 0777);
$size = @getimagesize($save_file);
//@unlink($save_file);//썸네일 생성후 수행
return $size;
}
//----------------------------------------------------------------
$data_path = $g4['path'] . "/data/file/$bo_table";
$lt_path = $data_path . "/lt_file";
$thumb_path = $data_path . "/thumb";
if (!is_dir($lt_path)){
@mkdir($lt_path, 0707);
@chmod($lt_path, 0707);
}
if (!is_dir($thumb_path)){
@mkdir($thumb_path, 0707);
@chmod($thumb_path, 0707);
}
//----------------------------------------------------------------
//친절한서기님 코드
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
$sql = mysql_query(" select wr_content from " . $write_table . " where wr_id = '" . $wr_id . "' ");
$row = mysql_fetch_array($sql);
$imgs = extract_img($row['wr_content']);
$url = $imgs[0];//첫번째 링크된 이미지
//$url = $row['wr_link1'];
//유창화님 문자열 처리코드 - 속성이 src앞에 올경우??
//preg_match("`<\s*img\s+src\s*=\s*['|\"]?([^'|\"\s]+://[^'|\"\s]+\.(gif|jpe?g|png))['|\"]?\s*[^>]+`i", $row['wr_content'], $images);
//$url = $images[1];
//$url = $row['wr_link1'];
$save_dir = $lt_path;//임시 저장경로
$referer = "";//속일 리퍼러, 넣지 않아도 됨
$size = Ygetimagesize($url, $save_dir, $referer);
//링크에서 파일명 가져옴
$filename = strrchr($url,"/");
$filename = substr($filename, 1);
$filename = urlencode($filename); //공백파일명등 썸네일 생성 확인
$dest_file = $lt_path . '/' . $filename;//임시파일 저장
//----------------------------------------------------------------
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $filename) && file_exists($dest_file)){
$thumb = $thumb_path.'/' . $filename;
$old_images = $row['wr_10'];
if (!empty($url)){//이미지 있음
//업데이트일때는 저장된 이미지와 새로 가져온 이미지가 다를경우만 처리
if (($w == '') || (($w == 'u') && ($old_images != $images[1]))) {
if (!file_exists($thumb)){
$size = getimagesize($dest_file);
if ($size[2] == 1)
$src = imagecreatefromgif($dest_file);
else if ($size[2] == 2)
$src = imagecreatefromjpeg($dest_file);
else if ($size[2] == 3)
$src = imagecreatefrompng($dest_file);
else
break;
if ($size[0] >= $size[1]){
$rate = $board[bo_1] / $size[0];
$width = $board[bo_1];
$height = (int)($size[1] * $rate);
}
else{
$rate = $board[bo_1] / $size[1];
$width = (int)($size[0] * $rate);
$height = $board[bo_1];
}
$dst = imagecreatetruecolor($width, $height);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagejpeg($dst, $thumb, $board['bo_2']);
chmod($thumb, 0707);
$sql = " update " . $g4['write_prefix'] . $bo_table . " set wr_10='".$images[1]."' where wr_id='".$wr_id."' ";
sql_query($sql);
@unlink($dest_file);//썸네일 생성후 임시파일 삭제
}//th
}//if
}//ur
else {//이미지 없음
//업데이트일때는 새로 저장할 이미지 없다면 기존이미지 삭제
if (($w == '') || (($w == 'u') && (!empty($old_images)))) {
$sql = " update " . $g4['write_prefix'] . $bo_table . " set wr_10='' where wr_id='".$wr_id."' ";
sql_query($sql);
@unlink($dest_file);//임시파일 삭제
@unlink($thumb);//썸네일 파일 삭제
}//if
}//el
}//pr
@unlink($dest_file);//임시파일 삭제
//----------------------------------------------------------------
?>
유창화님께서 알려주신 구문대로 작성해보니 업데이트에서 정지한후 넘기질 못합니다.
업데이트에서 정지할 경우 에러내용을 보는 방법을 몰라서 나름대로 재작성해보았습니다.
미결사항으로는 올려주신 `첫번째 이미지 파일을 찾는 문자열 처리방법`을 적용하면 src이전에 속성을 준경우 통과되는점이 있습니다.
최초 디비인서트까지 잘됩니다만, `이미지정보 변경없이 글을 수정할경우 디비에서 정보가 삭제`되는데 이 부분은 제능력으로는 수정이 어렵네요.ㅠㅠ
현재는 여분필드를 사용하지않고 생성된 썸네일경로를 지정해주는 방식으로 돌아는 가는듯 합니다만, 관련해서 어떤 문제가 있을런지요?
다음과 같이 write_update.tail.skin.php 작성해서 테스트해보았습니다.
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
//실행되는 동안 종료 되지 않도록 사용메모리와 실행가능 시간을 늘려준다. 유창화님
@set_time_limit (0);
@ini_set ("memory_limit", "20M");
//----------------------------------------------------------------
//링크된 이미지 썸네일 생성 테스트 - 유창화님 코드 응용, 2007년 1월 21일 일요일
//링크1번의 이미지 파일에 대한 썸네일 이미지 생성후 원본파일은 삭제합니다.
//생성된 썸네일 이미지는 리스트에 목록화 합니다.
//타 계정 이미지 파일을 링크할수 밖에 없는 상황에서 인덱싱을 위한 썸네일만을 만들기위해..
//변수가 정의 되었으면 해당 값을 반환하고 정의 되어있지 않으면 지정된 기본값을 반환합니다.
function Yvar_check(&$var, $return=''){
return (isset($var)) ? $var : $return;
}
//변수가 정의되지 않았거나 값이 NULL값 이거나, 값이 0, false 일경우 지정된 기본값을 반환합니다.
function Yvar_empty_check(&$var, $return=''){
return (!empty($var)) ? $var : $return;
}
function Ygetimagesize($url, $save_dir, $referer=''){
$array = parse_url($url);
$url_scheme = Yvar_check($array['scheme']);
$url_server = Yvar_check($array['host']);
$url_path = Yvar_check($array['path']);
$url_query= Yvar_check($array['query']);
$url_port = Yvar_empty_check($array['port'], 80);
//$save_file = $save_dir . preg_replace("`^.+(\.[^.]+)$`", '/' . uniqid("") . "\\1", $array['path']);
//원본 파일명을 그대로 사용합니다.
$filename = strrchr($array['path'],"/");
$filename = substr($filename, 1);
$save_file = $save_dir . '/' . $filename;
$fp = fsockopen($url_server, $url_port);
if (empty($fp)){
//echo "error-http소켓접속에 실패하였습니다.";
return Array();//배열만 생성해서 리턴
}
fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
fputs($fp, "Accept: */*\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\n");
fputs($fp, "Host: $url_server:$url_port\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Cache-control: private\n");
fputs($fp, "Pragma: no-cache\n");
fputs($fp, "Connection: close\n\n");
$text = '';
$check_header = false;
while (!feof($fp)){
$temp = fgets($fp, 1024);
if ($check_header == false){
//실제 파일이 아닌 헤더 정보인지 체크 하여 추가하지 않는다.
if (preg_match("'^(\r)?\n$'", $temp)){
$check_header = true;
continue;
}
}
else{
//헤더 정보가 아닌 경우에만 추가한다.
$text .= $temp;
}
}
fclose($fp);
$fp = @fopen ($save_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($save_file, 0777);
$size = @getimagesize($save_file);
//@unlink($save_file);//썸네일 생성후 수행
return $size;
}
//----------------------------------------------------------------
$data_path = $g4['path'] . "/data/file/$bo_table";
$lt_path = $data_path . "/lt_file";
$thumb_path = $data_path . "/thumb";
if (!is_dir($lt_path)){
@mkdir($lt_path, 0707);
@chmod($lt_path, 0707);
}
if (!is_dir($thumb_path)){
@mkdir($thumb_path, 0707);
@chmod($thumb_path, 0707);
}
//----------------------------------------------------------------
//친절한서기님 코드
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
$sql = mysql_query(" select wr_content from " . $write_table . " where wr_id = '" . $wr_id . "' ");
$row = mysql_fetch_array($sql);
$imgs = extract_img($row['wr_content']);
$url = $imgs[0];//첫번째 링크된 이미지
//$url = $row['wr_link1'];
//유창화님 문자열 처리코드 - 속성이 src앞에 올경우??
//preg_match("`<\s*img\s+src\s*=\s*['|\"]?([^'|\"\s]+://[^'|\"\s]+\.(gif|jpe?g|png))['|\"]?\s*[^>]+`i", $row['wr_content'], $images);
//$url = $images[1];
//$url = $row['wr_link1'];
$save_dir = $lt_path;//임시 저장경로
$referer = "";//속일 리퍼러, 넣지 않아도 됨
$size = Ygetimagesize($url, $save_dir, $referer);
//링크에서 파일명 가져옴
$filename = strrchr($url,"/");
$filename = substr($filename, 1);
$filename = urlencode($filename); //공백파일명등 썸네일 생성 확인
$dest_file = $lt_path . '/' . $filename;//임시파일 저장
//----------------------------------------------------------------
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $filename) && file_exists($dest_file)){
$thumb = $thumb_path.'/' . $filename;
$old_images = $row['wr_10'];
if (!empty($url)){//이미지 있음
//업데이트일때는 저장된 이미지와 새로 가져온 이미지가 다를경우만 처리
if (($w == '') || (($w == 'u') && ($old_images != $images[1]))) {
if (!file_exists($thumb)){
$size = getimagesize($dest_file);
if ($size[2] == 1)
$src = imagecreatefromgif($dest_file);
else if ($size[2] == 2)
$src = imagecreatefromjpeg($dest_file);
else if ($size[2] == 3)
$src = imagecreatefrompng($dest_file);
else
break;
if ($size[0] >= $size[1]){
$rate = $board[bo_1] / $size[0];
$width = $board[bo_1];
$height = (int)($size[1] * $rate);
}
else{
$rate = $board[bo_1] / $size[1];
$width = (int)($size[0] * $rate);
$height = $board[bo_1];
}
$dst = imagecreatetruecolor($width, $height);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagejpeg($dst, $thumb, $board['bo_2']);
chmod($thumb, 0707);
$sql = " update " . $g4['write_prefix'] . $bo_table . " set wr_10='".$images[1]."' where wr_id='".$wr_id."' ";
sql_query($sql);
@unlink($dest_file);//썸네일 생성후 임시파일 삭제
}//th
}//if
}//ur
else {//이미지 없음
//업데이트일때는 새로 저장할 이미지 없다면 기존이미지 삭제
if (($w == '') || (($w == 'u') && (!empty($old_images)))) {
$sql = " update " . $g4['write_prefix'] . $bo_table . " set wr_10='' where wr_id='".$wr_id."' ";
sql_query($sql);
@unlink($dest_file);//임시파일 삭제
@unlink($thumb);//썸네일 파일 삭제
}//if
}//el
}//pr
@unlink($dest_file);//임시파일 삭제
//----------------------------------------------------------------
?>

제가 쓰는 방법입니다...RSS reader에서..
http://www.okcounter.com/CUBEBLOG/bbs/board.php?bo_table=cubereader
//친절한 서기님 코드
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
//이미지를 골라내장...ㅠ.ㅠ
$imgs = extract_img($wr_content);
$total = count($imgs);
for($j=0 ; $total>$j; $j++){
if(preg_match("/^http:\/\/([^\/]+)(.*)$/", $imgs[0], $matches)){
$tmp_img =$imgs[0];
}
단, 소스보기를 아래 2개의 링크를 비교해보세요...
http://www.sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=163063 //이미지 출력됨
이미지 경로: http://~~~~
http://www.sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=163031 //이미지출력안됨
이미지 경로 : ../data~~~~~
링크 소스보기하시면 이미지 경로를 아실수 있습니다...^^
첨부화일과 에디터 인서트 이미지로군요....ㅠ.ㅠ
http://www.okcounter.com/CUBEBLOG/bbs/board.php?bo_table=cubereader
//친절한 서기님 코드
function extract_img($src) {
$re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|png|bmp))[\'"]/i';
preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
return $match[1];
}
//이미지를 골라내장...ㅠ.ㅠ
$imgs = extract_img($wr_content);
$total = count($imgs);
for($j=0 ; $total>$j; $j++){
if(preg_match("/^http:\/\/([^\/]+)(.*)$/", $imgs[0], $matches)){
$tmp_img =$imgs[0];
}
단, 소스보기를 아래 2개의 링크를 비교해보세요...
http://www.sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=163063 //이미지 출력됨
이미지 경로: http://~~~~
http://www.sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=163031 //이미지출력안됨
이미지 경로 : ../data~~~~~
링크 소스보기하시면 이미지 경로를 아실수 있습니다...^^
첨부화일과 에디터 인서트 이미지로군요....ㅠ.ㅠ
감사합니다.
문자열 처리 부분은 참으로 헷갈리는군요.^^
src 앞부분에 속성을 준 링크가 걸리지 않는듯 하지만,
유창화님께서 알려주신 문자열 처리방법은 단 한줄로 첫번째 이미지를 가져오는군요.
사형님것도 업어다가 분석좀 해보겠습니다.~~*
기존의 프로그램이 돌아가는 계정엔 단지 링크만 있고 실제 이미지는 타계정에서 끌어오는 방식으로 수년을 운영해온 곳이라 뾰족한 방법이 없는듯 합니다.
올해도 많이 많이 괴롭혀드리것을 약속드리며 건승하시길 바랍니다~!
도와주세용~~**
문자열 처리 부분은 참으로 헷갈리는군요.^^
src 앞부분에 속성을 준 링크가 걸리지 않는듯 하지만,
유창화님께서 알려주신 문자열 처리방법은 단 한줄로 첫번째 이미지를 가져오는군요.
사형님것도 업어다가 분석좀 해보겠습니다.~~*
기존의 프로그램이 돌아가는 계정엔 단지 링크만 있고 실제 이미지는 타계정에서 끌어오는 방식으로 수년을 운영해온 곳이라 뾰족한 방법이 없는듯 합니다.
올해도 많이 많이 괴롭혀드리것을 약속드리며 건승하시길 바랍니다~!
도와주세용~~**

타 서버에 있는 이미지 주소도 썸네일로 뽑던가요??
전 안 되던데 ㅡ ㅡa
전 안 되던데 ㅡ ㅡa
조금전에 위쪽 코멘트에 미완성 write_update.tail.skin.php 파일을 붙였습니다.
썸네일 생성까지는 잘됩니다만,, 몇가지 문제점이 남아있습니다.
한번 보시고 테스트 부탁드립니다.^^
썸네일 생성까지는 잘됩니다만,, 몇가지 문제점이 남아있습니다.
한번 보시고 테스트 부탁드립니다.^^
...