2015-11-04 32 views
0

基本上我試圖使用preg_match_all來執行多重搜索。 我有3個陣列:preg_match_all多字搜索

  • $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>'; 
    /* ----- */ 
} 

但它無法正常工作。我的代碼有什麼問題?由於

+0

你能從哪裏獲得'$ searchWordBis [$ i]'?你在裏面得到什麼?對於你使用以下正則表達式的字符串 –

+0

'「/ \ b $ searchWordBis [$ i] \ b/i」'應該是'「/ \ b {$ searchWordBis [$ i]} \ b/i」'? '$ i'沒有在你的關閉中定義。編輯:您的代碼格式不正確。看到我建議的更改如下: –

+0

@Uchiha我以爲$ searchWordBis [$ i]可以用來訪問數組的$ i元素。 – Eliott

回答

0

試試這個:

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)); 
    ... 
在你關閉

,包括使用條款中$i,並用花括號來排列。或者你也可以使用foreach代替for避免我認爲使用。如果你想爲每個單詞的結果preg_grep更簡單

$pattern = '~\b(?:' . implode('|', $searchWordBis) . ')\b~S'; 

$result = preg_grep($pattern, $linkArray); 

櫃檯

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)); 
    ... 
0

foreach ($searchWordBis as $searchWord) { 
    echo $searchWord . PHP_EOL; 
    print_r(preg_grep('~\b' . $searchWord . '\b~', $linkArray)); 
}