2012-02-21 29 views
0

當呈現搜索結果時,我需要提供包含搜索詞的預覽字符串,與Google顯示結果的方式類似。如何在更長的字符串內搜索查詢時獲得摘要字符串?

如何在不分割任何單詞的情況下在更長的字符串內獲得搜索詞的上下文?

例子:

鑑於長字符串:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum. 

與搜索詞:sed diam nonummy

我如何以編程方式返回結果:

... consectetuer adipiscing elit,sed diam nonummy n ibh euismod tincidunt ...

我在上面的搜索字詞周圍使用了三個單詞。

回答

0

以下對我有幫助的Tim Pietzcker在question上工作。

<?php 
function summarize($haystack,$needle,$wordLimit = 5) { 

    // first get summary of text around key word (needle) 
    $preg_safe = str_replace(" ", "\s", preg_quote($needle)); 
    $pattern = "/(\w*\S\s+){0,$wordLimit}\S*\b($preg_safe)\b\S*(\s\S+){0,$wordLimit}/ix"; 
    if (preg_match_all($pattern, $haystack, $matches)) { 
     $summary = str_replace(strtolower($needle), "<strong>$needle</strong>", $matches[0][0]) . '...'; 
    } else { 
     $summary = false; 
    } 

    return $summary; 
} 
$haystack = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.'; 
$needle = 'dolor sit amet'; 
echo summarize($haystack,$needle); 
?> 
0

你的琴絃有多大?

你可以存儲每個單詞,它的位置在字符串中。

然後查詢並獲取位置,返回[position - offset,position + offset]字符串。

您可以使用strpos找到您要查找的術語的位置。

http://php.net/manual/en/function.strpos.php

,如果你想返回完整的單詞,直到你找到一個空間或字符串商店的開始位置的字符去焦炭向後然後使用失調的想法,或。 然後前進,同樣的想法存儲那個位置。然後使用substr($ string,int $ leftpos,$ rightpos - $ leftpos)

+0

謝謝zad。我的字符串通常是1000字左右。 – Ryan 2012-02-21 06:47:26