검색된 부분을 출력하고 싶습니다
본문
림프기관이라고 검색을 하면 위쪽은 글의 중간에 "림프기관"이 있어서 두번째 검색처럼 굵게 검색된 부분이 굵게 보이지 않습니다.
어떻게 하면 처음 검색된 부분의 앞 / 뒤 를 뽑아올수 있을까요?
소스부분입니다
<div id="search_alist">
$k=0;
for($idx=$table_index, $k=0; $idx<count($search_table) && $k<$rows; $idx++) {
?>
<div class="line"></div>
<h3><a href='./board.php?bo_table=<?=$search_table[$idx]?>&<?=$search_query?>'><?=$bo_subject[$idx]?>(<?=count($list[$idx])?>)
</a></h3>
<ul>
<?
$comment_href = "";
$data_path = $g4[path]."/data/file/".$search_table[$idx];
$thumb_data_path = $g4[path]."/data/file/$search_table[$idx]/thumb";
for($i=0; $i<count($list[$idx]) && $k<$rows; $i++, $k++){
$comment_href=$comment=$img=$file_name="";
$list[$idx][$i][subject]=str_replace("<span style='background-color:YELLOW; color:RED;'>","<span class='s_word1'>",$list[$idx]
[$i][subject]);
$list[$idx][$i][content]=str_replace("<span style='background-color:YELLOW; color:RED;'>","<span class='s_word2'>",$list[$idx]
[$i][content]);
// 가변 파일
$file['file'] = get_file($search_table[$idx], $list[$idx][$i][wr_id]);
$file_name=$file[file][0][file];
$file_reading=$data_path."/".$file_name;
$simg=$thumb_data_path."/s".$file_name;
if($file_name && file_exists($file_reading)){
if(file_exists($simg)) $img=$simg;
else $img=$file_reading;
}
if($list[$idx][$i][wr_is_comment]) {
$comment_href = "#c_".$list[$idx][$i][wr_id];
$comment="[코멘트] ";
}
?>
<li>
<p class="s_subject"><a href="<?=$list[$idx][$i][href].$comment_href?>"><?=$comment.$list[$idx][$i][subject]?></a> <a
href="<?=$list[$idx][$i][href].$comment_href?>" target="_blank9eaecd">[새창]</a></p>
<p class="s_content">
<?if($img){?>
<a href="<?=$list[$idx][$i][href]?>"><img src="<?=$img?>" width="90" align="left" class="s_thm"></a>
<?}?>
<?=$list[$idx][$i][file]?><?=$list[$idx][$i][content]?></p>
<p><span class="s_name"><?=$list[$idx][$i][name]?></span> - <span class="s_date"><?=$list[$idx][$i][wr_datetime]?
></span></p>
</li>
<?}?>
</ul>
<?}?>
</div>
어느 분의 스킨인지 잘 모르겟습니다.. 너무 오래전에 썻던거라.. 많은 도움 부탁드립니다.
아 그리고 검색된 부분이 굵게 대신 색칠이 되는 방식도 궁금한데...알려주시면 감사하겟습니다.ㅜㅜ
답변 1
이거 질문올리신거 예전에도 본거라 언제 보실지 모르겠지만
제가 큰맘먹고 한번 도전해봤습니다.
(이게 그냥저냥 말로 설명할 수준이 아니라서요)
아무튼 어렵지 않게 고쳤으니 수정방법을 잘 따라하시면 됩니다.
일단 간단한거 먼저 설명하고 시작해보죠.
1. 색깔바꾸는 부분은 어디인가?
이게 좀 애매한데요.
원래 검색어 색깔 바꾸는건 그누보드4 관리자 모드에 가시면
기본환경설정 - 게시판 설정 - 검색 배경 색상, 검색 글자 색상에서 바꿀 수 있습니다.
그런데...질문자님이 가져온 소스는 다른 분이 개조한 소스라서요.
그부분을 한번 더 변형해서 사용하고 있어요.
$list[$idx][$i][subject]=str_replace("<span style='background-color:YELLOW; color:RED;'>","<span class='s_word1'>",$list[$idx][$i][subject]);
$list[$idx][$i][content]=str_replace("<span style='background-color:YELLOW; color:RED;'>","<span class='s_word2'>",$list[$idx][$i][content]);
이부분입니다. 앞에 color 부분이 그누보드 원본인데, 뒤에 껄로 교체한겁니다. CSS로...
그러니 이부분은 그냥 두시고 해당 css 파일을 찾아서
(무슨 파일인지는 저도 모릅니다. 아마 스킨폴더에 같이 들어있지 싶습니다.)
.s_word1 , .s_word2 (앞에 점이 붙어있습니다.) 두 부분을 찾아 css를 고치시는게 편하실 겁니다.
아니면 저 두줄을 그냥 지워버리시고, 그누보드4 관리자에서 교체하시던지 하십시오.
2. 검색어 위치를 맞춰서 검색결과를 부르고 싶다...
우~ 이거 쉽지 않았어요. 생각할게 좀 많았음;;
일단 아래 올려진 소스를 복사해서 --> 복사는 마우스 올리시면 [<>] 이렇게 생긴 아이콘
그누보드 설치폴더에 있는 lib 폴더 아래 common.lib.php 파일이 있을 겁니다.
거기 맨아래 적당히 붙여 넣으세요. 그리고 저장합니다.
//$str 원본
//$len 남길 글자수
//$stx 검색어
//$pad 검색어의 위치에 따라 앞에 남길 글자수
//$suffix 원본이 남길 글자수보다 클때 뒤에 붙일 접미어
function cut_str_search($str, $len, $stx, $pad, $suffix = "…")
{
global $g4;
$tmp = array();
preg_match('/'.$stx.'/' , $str, $tmp, PREG_OFFSET_CAPTURE);
$word_offset = $tmp[0][1]; // 검색어의 위치(Byte)
$result = "";
$x = array();
if(strtoupper($g4['charset']) == "UTF-8") {
preg_match_all('/[\x00-\x7F,\s]|[\xC0-\xFF][\x80-\xBF]./', $str, $x); // 글자단위로 분할(UTF-8)
} else {
preg_match_all('/[\x00-\x7F,\s]|[^\x00-\x7F]./', $str, $x); // 글자단위로 분할(EUC-KR)
}
$arr = $x[0]; //한글자씩 담긴 배열
$size = count($arr); //전체 글자수
if($size <= $len) return $str; //전체 글자수가 남길 글자수보다 작으면 바로 결과처리
$find_offset = 0;
$find_pos = 0; // 검색어의 글자위치(글자수)
// 검색어 Byte 위치로 글자순서 몇번째인지 찾기
for($i = 0; $i < $size; $i++) {
if($find_offset == $word_offset) {
$find_pos = $i + 1;
break;
}
$find_offset += strlen($arr[$i]);
}
$start = 1; // 앞에 글자를 붙이지 않아도 될때 시작위치
if($find_pos >= $pad) $start = $find_pos - $pad; // 앞에 글자를 붙여야할 때 시작위치
$end = $start + $len; // 종료 위치
if(($size - $start) <= $len) $end = $size;
for($i = 0; $i < $size; $i++) {
if(($i + 1) >= $start) $result .= $arr[$i];
if(($i + 1) > $end) break; //위치넘어서면 종료
}
if($size > $len) {
if($start > 1) $result = $suffix.$result; // 앞생략되면 앞에
if($end != $size) $result .= $suffix; // 뒤생략되면 뒤에
}
unset($arr);
return $result;
}
에러가 나지 않는지 페이지를 새로고침 한번 해보시구요.
별반응 없으면 잘 된거니 다음 두번째 작업을 합니다.
실은 이 기능은 위에 올려진 소스에서 고칠수 있는게 아닙니다.
다른 파일을 건드려야되는데요.
그 파일은 bbs 폴더 아래 search.php 라는 파일입니다.
그 파일을 열어보면 중간쯤에
if ($read_level[$idx] <= $member[mb_level])
{
$content = cut_str(get_text($row[wr_content]),300,"…");
if (strstr($sfl, "wr_content"))
$content = search_font($stx, $content);
}
else
$content = '';
이렇게 된 부분이 있는데요.
$content = cut_str(get_text($row[wr_content]),300,"…");
이부분을
$content = cut_str_search(get_text($row[wr_content]), 300, $stx, 20, "…");
이렇게 바꿉니다.
위에 300이라는 숫자는 내용중에 몇글자를 화면에 보여줄거냐~를 결정합니다.
위에 20이라는 숫자는 중간에 검색어가 나오면, 앞에 몇글자나 더 붙여서 보여줄거냐~를 결정합니다.
20부분에는 적당히 보기 좋은 숫자를 입력하시면 됩니다. 뒤는 알아서 남은 걸 뽑아줍니다.
별 문제없이 한방에 해결됐으면 좋겠네요.
그럼 이만.