我想要做的是搜索一个单词(或几个单词),然后返回一个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!
答案 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检查关键字是否存在。