好吧,假设我有一段文字:
在他一生中第一次也是最后一次被淘汰后,杜兰特从沙发上看着美国队跳着华尔兹进入金牌比赛,然后接受了西班牙的考验,最终以118-107的胜利结束了美国男子国家队八年来的金牌荒。但是美国在国际篮联世锦赛上的金牌荒依然完整,现在已经16年了,美国队准备前往土耳其,而没有任何来自北京的救援队成员。
我想要做的是在文本上运行一个php preg_match_all几个关键字(例如'team‘和' for '),然后检索每个结果的片段(可能之前10个单词,后面10个单词)。
有人知道怎么做吗?
发布于 2010-07-22 07:28:57
你可以这样做:
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).' … ';
}
}发布于 2010-07-22 07:14:24
检查这个http://www.php.net/manual/en/regexp.reference.squarebrackets.php
这是一个带有分隔符的词:
([:word:].*[:punct:])这是九月的十个字。
([:word:].*[:punct:]){10}像这样的东西很接近你的解决方案:
([:word:].*[:punct:].){10}team([:punct:].[:word:].*){10}发布于 2010-07-22 07:23:53
您可能会在Drupal搜索费力构建器中找到许多有趣的想法。
http://api.drupal.org/api/function/search_excerpt/6
这是一个UTF8 8-安全,并有各种边缘-案件涵盖。
https://stackoverflow.com/questions/3306513
复制相似问题