好吧我说有一段文字:
第一次和第一次被削减后 在他生命的最后一次,杜兰特看着 来自沙发作为美国队 跳进金牌比赛和 然后最终由西班牙进行了测试 以118-107的胜利出现 结束了为期八年的金牌干旱 对于美国高级男子的国民 球队。但金牌干旱令人失望 FIBA世界的美国人 锦标赛保持不变,现在是16岁 多年来一直算作美国队 准备前往土耳其,没有任何 所谓的救赎成员 来自北京的团队。
我想做的是运行一个php preg_match_all 几个关键字(例如 'team'和'for')在文本上,然后为每个找到的结果检索一个片段(之前可能是10个单词,之后可能是10个单词)。
任何人都知道如何做到这一点?
答案 0 :(得分:2)
你可以这样做:
preg_match_all
获取所有字词及其偏移的列表。以下是一个例子:
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);