使用preg_match_all获取空数组结果,以获取不匹配的值

时间:2010-09-28 19:36:53

标签: php regex preg-match-all

我正在使用preg_match_all在Twitter搜索响应中搜索HashTag值。

除了搜索结果中没有任何哈希值之外,它的工作方式与我的预期相同。出于某种原因,我的$ tags数组仍然有值,我不知道为什么。

是因为我的RegEx不正确,还是preg_match_all有问题?

由于

$tweet = "Microsoft Pivot got Runner-Up for Network Tech from The Wall Street Journal in 2010 Technology Innovation Awards  http://bit.ly/9pCbTh";

private function getHashTags($tweet){
    $tags = array();
    preg_match_all("/(#\w+)/", $tweet, $tags);

    return $tags;

}

结果:

Array ( [0] => Array ( ) [1] => Array ( ) )

预期结果:

Array();

2 个答案:

答案 0 :(得分:4)

在默认模式下,preg_match_all返回匹配和子匹配数组:

  

<强> PREG_PATTERN_ORDER
  对结果进行排序,以便$matches[0]是完整模式匹配的数组,$matches[1]是由第一个带括号的子模式匹配的字符串数组,依此类推。

因此,在这种情况下,第一个数组是整个模式的匹配数组,第二个数组是第一个子模式的匹配数组。由于找不到匹配项,因此两个数组都是空的。

如果您想要其他订单,在数组中使用其子匹配进行匹配,请在 flags 参数中使用PREG_SET_ORDER

preg_match_all("/(#\w+)/", $tweet, $tags, PREG_SET_ORDER);

答案 1 :(得分:1)

您将获得两个空数组,因为您正在匹配表达式和子表达式。您的预期结果实际上是错误。检查the manual,特别是在第四个参数中没有传递标志时的默认行为的描述:

  

对结果进行排序,以便$ matches [0]是完整模式匹配的数组,$ matches 1是由第一个带括号的子模式匹配的字符串数组,依此类推。

除非传递PREG_OFFSET_CAPTURE作为flag参数,否则总是从preg_match_all获取多维数组。在这种情况下,实际上应该为一个与任何东西都不匹配的表达式获取一个空数组。