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