【问题标题】:getting empty array results using preg_match_all for values that don't match使用 preg_match_all 获取不匹配的值的空数组结果
【发布时间】:2011-04-18 11:58:56
【问题描述】:

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

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢结果数组的解释。这是有道理的,既然我知道要寻找什么,我就可以使用我的解决方案了。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这不是真的,你需要通过PREG_SET_ORDER
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多