2012-07-10 148 views
1

我正在循環訪問一個關聯數組,並嘗試將來自needle數組的整個單詞匹配到haystack數組中。下面的代碼工作完美,但因爲它的匹配字符串的任意次數返回過多的結果:PHP - preg_match關聯數組中的整個單詞,使用stristr但不使用preg_match

$result = array(); 
$name1 = array(); 
$name2 = array(); 
foreach($object->organizations as $o) { 
    foreach($objectCrunch as $o2) { 
     $name1 = $o->name; 
     $name2 = $o2->name; 

     if(stristr($name2, $name1)) { 
      $result[] = $o2->permalink; 
     } 
    } 
} 

當我嘗試下面的代碼:

$result = array(); 
$name1 = array(); 
$name2 = array(); 
foreach($object->organizations as $o) { 
    foreach($objectCrunch as $o2) { 
     $name1 = $o->name; 
     $name2 = $o2->name; 

     $pattern = "'/\b" . $name2 . "\b/i'"; 

     if(preg_match($pattern, $name1)) { 
      $result[] = $o2->permalink; 
     } 
    } 
} 

我得到一個空數組。獲得最後一段代碼的任何幫助都很好。

感謝, 格雷格

+0

嘗試更換'$ pattern =「'/ \ b」。 $ name2。 「\ b/i'」;'用'$ pattern =「'/ \ b」。 preg_quote($ name2)。 「\ b/i'」;' – nickb 2012-07-10 16:42:37

+0

服務器錯誤...我不認爲$模式字符串是問題。我認爲問題是我的正則表達式是否正確。 – Greg 2012-07-10 16:47:24

+0

你的'$ pattern'字符串正在形成一個正則表達式,所以兩者是相同的。 – nickb 2012-07-10 16:49:38

回答

1

您正在使用2對delimiters這裏:

$pattern = "'/\b" . $name2 . "\b/i'"; 
      ||  
      1| 
      2 

二者必選其一/'
我會說單引號是多餘的,並匆忙複製&粘貼的結果。

此外,preg_quote爲內容/單詞,如果它可能包含任一。


正如埃利亞斯指出的那樣;下一個陷阱很可能是嘗試將長內容變量用作搜索參數。如果你沒有給你的變量賦予無意義的枚舉名稱,這將是一個明顯的錯誤。

其中只有一個可能是實際的單詞或名稱。另一個應該被稱爲內容或東西:

$word = $o->name; 
    $textcontent = $o2->name; 

使用這些從此。
在此過程中,也會相應地修復對象屬性的命名。

+1

如果'$ name2'包含我們不想被評估的任何特殊的正則表達式字符,例如句點,星號或加號,'preg_quote'也是必要的。 – nickb 2012-07-10 16:47:54

+0

好抓,但這不是問題更重要嗎?即:乾草堆 - >針VS模式 - >字符串 – 2012-07-10 16:47:55

+0

這是我的觀點,OP使用'stristr'調用乾草堆作爲模式,以匹配$ name1變量 – 2012-07-10 16:54:53

1

這很簡單,真的。由於在PHP一些怪癖,stristr語法如下:

stristr($haystack,$needle); 

preg_match的第一個參數作爲針。例如:

$name1 = 'name of chief object'; 
$name2 = 'I am a child of name of chief object'; 
stristr($name2,$name1);//looks for 'name of chief object' in $name2 

preg_match('/\b'.$name2.'\b/i',$name1);//does the exact oposite 
+1

是的,你是對的。 '$ name2'的確是乾草堆,所以它不能用作preg_match的搜索參數(無論是哪種正則表達式變體)。 - 所以,如果有的話,這是一個教訓,如何不給無表情變量名稱。 – mario 2012-07-10 16:56:28

+0

而且,當然是RTFM的經典案例 – 2012-07-10 16:57:32