我正在使用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();
答案 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获取多维数组。在这种情况下,实际上应该为一个与任何东西都不匹配的表达式获取一个空数组。