검색된 부분을 출력하고 싶습니다

검색된 부분을 출력하고 싶습니다

QA

검색된 부분을 출력하고 싶습니다

본문

 

 

 

림프기관이라고 검색을 하면 위쪽은 글의 중간에 "림프기관"이 있어서 두번째 검색처럼 굵게 검색된 부분이 굵게 보이지 않습니다.

어떻게 하면 처음 검색된 부분의 앞 / 뒤 를 뽑아올수 있을까요?

 

c9babea3a22ebcb5829550d5e4dfe799_1431776229_5248.png 

 

소스부분입니다

 

<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부분에는 적당히 보기 좋은 숫자를 입력하시면 됩니다. 뒤는 알아서 남은 걸 뽑아줍니다.

 

별 문제없이 한방에 해결됐으면 좋겠네요.

그럼 이만.

답변을 작성하시기 전에 로그인 해주세요.
전체 125,994 | RSS
QA 내용 검색

회원로그인

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