如何在较长的字符串中获取搜索查询的摘要字符串?

时间:2012-02-21 06:12:21

标签: php string text

在展示搜索结果时,我需要提供一个包含搜索字词的预览字符串,类似于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 nibh euismod tincidunt ...

我在上面的搜索字词中使用了三个单词。

2 个答案:

答案 0 :(得分:0)

你的琴弦有多大?

您可以存储每个单词及其在字符串中的位置。

然后查询并获取位置,返回[position - offset,position + offset] string。

您可以使用strpos查找您要查找的术语的位置。

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

然后使用偏移量的想法,或者如果要返回完整的单词,请向后转到char,直到找到一个空格或字符串的开头存储该位置。     然后前进,同样的想法存储那个位置。然后使用substr($ string,int $ leftpos,$ rightpos - $ leftpos)

答案 1 :(得分: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);
?>