2011-03-04 1 views
4

문자열의 입력이 주어진 경우 문자열의 끝을 주어진 길이로 잘라내어 매우 간단한 요약 형식을 생성해야합니다.문자열에서 요약을 자동으로 생성합니다.

// Take an array of strings and generate a summary within a given length 
function stringSummaryFromMetadata($inArray,$len=80,$sep='§'){ 

    // Filter out 'false' values 
    $inputs=array_filter($inArray); 

    // First try just imploding array 
    $res=implode($sep,$inputs); 

    // Check for length 
    if(mb_strlen($res, 'utf8')>$len){ 

     // Calculate 'z' the fixed width constant 
     $x=count($inputs); 
     $z=round(($len-$x)/$x); 

     // Snip all strings to 'z' 
     $t1=array(); 
     foreach($inputs as $i) $t1[]=mb_substr($i,0,$z); 

     // Final answer 
     $res=implode($sep,$t1); 
    } 

    return $res; 
} 

시험 :

$test=array(
    'Ligula diam risus tempus lorem sit', 
    'Cursus metus commodo enim odio orci', 
    'Metus sapien porta sapien fusce sodales', 
    'king queen' 
); 
$out=stringSummaryFromMetadata($test); 
print $out; 

준다 :

Ligula DIAM의 risus의 t§Cursus의 metus commod§Metus 사피엔스 간이 여기

는 최초 버전의 함수 퀸 여왕

충분히 좋지만 더 최적 일 수 있습니다. 예를 들어, 테스트 출력은 80 글자보다 작습니다. 트리밍 후 줄 끝의 공백, 단어가 잘린 경우 등입니다.

접하기 전에 나 자신을 굴려서 커뮤니티에 물어보고 싶습니다. 이전에 이것이 요구되었을 경우, 또는 알고리즘이 벌써 존재하고있는 경우.

+0

'str_word_count'가 더 잘 작동합니다. 특히 HTML 엔티티를 깰 필요가 없습니다. – ajreal

+0

@ajreal abot HTML 엔티티가 걱정되지 않습니다. str_word_count를 사용하면 가장 자주 나오는 단어를 보여주는 것이 요약을 보여주는 더 좋은 방법이라고 말하는 것입니까? – zaf

+0

아니요, 목적은 단어 수가 많은 배열을 얻는 것입니다. 조합 단어 길이의 합계가 얼마나되는지 확인하기 위해 루프를 수행하여 초과 할 경우 위치/단어를 제외하십시오. – ajreal

답변

2

wordwrap을 사용하고 결과 문자열에 줄 수가 몇 개인 지 계산할 수 있습니다. 두 개 이상인 경우 텍스트가 필요 이상으로 길어서 첫 번째 줄 끝에 구분 기호를 추가하고 다른 줄은 버립니다. 한 줄만 있으면 텍스트가 짧아서 트리밍이 수행되지 않았습니다.

wordwrap은 utf8을 인식하지 못하지만 utf8_wordwrap 작동 기능을 나타내는 comment이 있습니다.

+0

우리는 시작 부분의 문자열뿐만 아니라 모든 입력 문자열의 일부를 포함하는 요약입니다. – zaf

+0

아니, 너는 나를 이해하지 못했다. 각 입력 문자열에 대해'wordwrap'은 한 라인 당 최대 너비로 포맷 된 문자열을 반환합니다. 일부 입력 문자열이 너무 길면 여러 줄 문자열로 반환됩니다. 첫 번째 줄을 얻고 구분 기호를 추가하고 나머지 줄을 버립니다. 그리고 다른 모든 입력 문자열에 대해 동일한 작업을 수행하십시오. –

+0

나는 당신을 지금 얻는다. 팁 주셔서 감사. – zaf