2

我正在使用 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();
4

2 回答 2

4

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

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

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

如果您想要另一个顺序,将每个匹配项与其子匹配项放在一个数组中,PREG_SET_ORDER请在flags参数中使用:

preg_match_all("/(#\w+)/", $tweet, $tags, PREG_SET_ORDER);
于 2010-09-28T19:42:27.473 回答
1

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

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

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

于 2010-09-28T19:40:47.867 回答