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

时间:2014-05-05 09:22:48

标签: php search

我想要做的是搜索一个单词(或几个单词),然后返回一个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;
    }
}

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

有谁知道我怎么能更动态地做到这一点?所以PHP知道有多少单词..?

THX!

3 个答案:

答案 0 :(得分:1)

这就是你想要的:

$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次。 / p>

查看其中包含更多信息here

答案 1 :(得分:1)

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

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

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

另外,您可能需要查看preg_match_all并处理替换代码。

答案 2 :(得分:0)

我认为更好的解决方案是使用爆炸,然后在结果数组中创建一个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检查关键字是否存在。