[英]preg_match_all multi word search
基本上,我正在尝试使用preg_match_all来执行多重搜索。 我有3个数组:
$searchWordBis
,其中包含要搜索的单词。 $linkArray
,它包含字符串,这是我要搜索的数组。 $matches
,其中将包含研究结果。 我希望在$ linkArray中搜索$ searchWordBis的每个单词。
这是我写的:
for ($i = 0; $i <= count($searchWordBis)-1 ; $i++) { //loop test to do the search for each word of $searchWordBis and that way opperate a multi-words search
$fct = function($var) use ($searchWordBis) { //$fct is a "closure" (anonymous function)
return preg_match_all("/\b$searchWordBis[$i]\b/i", $var, $pregMatches);
};
$matches = array_values(array_filter($linkArray, $fct)); //filtering $matches array according to $fct + reseting index
/* Tests */
echo $searchWordBis[$i];
echo '<br>';
echo '<pre>';
var_dump($pregMatches);
echo '</pre>';
echo '<pre>';
var_dump($matches);
echo '</pre>';
/* ----- */
}
但这不起作用。 我的代码有什么问题? 谢谢
尝试这个:
for ($i = 0; $i <= count($searchWordBis)-1 ; $i++) {
$fct = function($var) use ($searchWordBis, $i) {
return preg_match_all("/\b{$searchWordBis[$i]}\b/i", $var, $pregMatches);
};
$matches = array_values(array_filter($linkArray, $fct));
...
在您的闭包中,在use子句中包含$i
,然后将数组括在花括号中。 或者您也可以使用foreach
代替for
来避免计数器
foreach ($searchWordBis as $pattern) {
$fct = function($var) use ( $pattern) {
return preg_match_all("/\b$pattern\b/i", $var, $pregMatches);
};
$matches = array_values(array_filter($linkArray, $fct));
...
我认为使用preg_grep
更简单
$pattern = '~\b(?:' . implode('|', $searchWordBis) . ')\b~S';
$result = preg_grep($pattern, $linkArray);
如果您想要每个单词的结果:
foreach ($searchWordBis as $searchWord) {
echo $searchWord . PHP_EOL;
print_r(preg_grep('~\b' . $searchWord . '\b~', $linkArray));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.