在PHP中查找关键字前后的单词


find words before and after a keyword in PHP

我想做的是搜索一个词(或几个词),然后返回一个字符串的5个词之前,和5个词之后的关键字。

我的PHP代码是这样的:
function getPreview($keyWord, $searchArea) {
    preg_match("/('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?$keyWord ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)?/i", $searchArea, $result);
    foreach ($result as $res) {
        return preg_replace("/$keyWord/", "<B>$keyWord</B>", $res);
        break;
    }
}

唯一的问题是,当前面或后面没有5个单词时,PHP不会返回这个。

有谁知道我怎样才能使它更动态吗?PHP知道有多少单词?

谢谢!

我猜这就是你想要的:

$re = '/(('w* ){0,5})(keyWord)(( 'w*){0,5})/i'; 
$str = 'klaus steven keyword peter holger und so weiter und so fort'; 
preg_match_all($re, $str, $matches);

它有"单词后跟空格"0到5次,然后是你的关键字,然后是另一个"空格后跟单词"0到5次。

查看更多信息在这里

如果您想坚持使用正则表达式,这个可以使用更少的单词。此外,如果关键字包含问号或任何其他正则表达式字符,则需要对关键字进行转义。

$escapedKeyword = preg_quote($keyWord,'/');
preg_match("/('w+ ){0,5}?$escapedKeyword( 'w+){0,5}/", $searchArea, $result);

?标记在{0,5}量词之后,使其不贪婪。这意味着它将在匹配前尝试尽可能少的单词,使其能够在关键字前少于5个单词时工作。

您还可以查看preg_match_all并处理替换代码。

我认为更好的解决方案是使用爆炸,然后在结果数组中进行array_search。这个数组是数字索引的,因此您可以简单地知道答案前后有多少个单词。类似这样的操作可以工作(未测试):

<?php
function getPreview($keyWord, $searchArea) {
    $results = explode(' ', $str);
    $indexOfMyKeyword = array_search($keyword, $results);
    $before = array_slice($results, $indexOfMyKeyword, -5);
    $after = array_slice($results, $indexOfMyKeyword, 5);
    return implode(' ', $before).' '.$keyword.' '.implode(' ', $after);
}

在尝试使用array_search提取关键字的位置之前,可以选择使用in_array检查关键字是否存在。