2012-07-10 257 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