php从preg_match中找到一小段内容

时间:2010-07-22 07:06:19

标签: php regex

好吧我说有一段文字:

  

第一次和第一次被削减后   在他生命的最后一次,杜兰特看着   来自沙发作为美国队   跳进金牌比赛和   然后最终由西班牙进行了测试   以118-107的胜利出现   结束了为期八年的金牌干旱   对于美国高级男子的国民   球队。但金牌干旱令人失望   FIBA世界的美国人   锦标赛保持不变,现在是16岁   多年来一直算作美国队   准备前往土耳其,没有任何   所谓的救赎成员   来自北京的团队。

我想做的是运行一个php preg_match_all 几个关键字(例如 'team'和'for')在文本上,然后为每个找到的结果检索一个片段(之前可能是10个单词,之后可能是10个单词)。

任何人都知道如何做到这一点?

4 个答案:

答案 0 :(得分:2)

你可以这样做:

  • 使用带有 PREG_OFFSET_CAPTURE 标志的preg_match_all获取所有字词及其偏移的列表。
  • 重复单词并找到搜索词。
  • 在比赛前后获取 x 字样。

以下是一个例子:

preg_match_all('/[\w-]+/u', $str, $matches, PREG_OFFSET_CAPTURE);
$term = 'team';
$span = 3;
for ($i=0, $n=count($matches[0]); $i<$n; ++$i) {
    $match = $matches[0][$i];
    if (strcasecmp($term, $match[0]) === 0) {
        $start = $matches[0][max(0, $i-$span)][1];
        $end = $matches[0][min($n-1, $i+$span+1)][1];
        echo ' … '.substr($str, $start, $end-$start).' … ';
    }
}

答案 1 :(得分:0)

选中此http://www.php.net/manual/en/regexp.reference.squarebrackets.php

所以这是一个带分隔符的单词:

([:word:].*[:punct:])

这些是带有sep的十个单词。

([:word:].*[:punct:]){10}

这样的事情将接近你的解决方案:

([:word:].*[:punct:].){10}team([:punct:].[:word:].*){10}

答案 2 :(得分:0)

你可能会在Drupal搜索exerpt构建器中找到很多有趣的想法。

http://api.drupal.org/api/function/search_excerpt/6

这个版本是UTF8安全的,涵盖了各种边缘案例。

答案 3 :(得分:0)

这样的事情可以解决这个问题,因为你搜索的单词应该是至少4个单词的距离,或者它不会匹配它......你可以改变它并进行调整。这样您就可以调整关键字之间关系的重要性

preg_match_all("~([\w]+[\s\- ,]+){0,3}watched([\s\- ,]+[\w]+){0,4}\ssofa([\s\- ,]+[\w]+){0,3}~i", $text, $matches);