繁体   English   中英

preg_match_all多词搜索

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM