如何避免捕获给定正则表达式模式的主要组?

时间:2012-02-10 15:36:32

标签: php regex pcre

我有一个正则表达式模式:

<^(([a-z]+)\:([0-9]+)\/?.*)$>

如何避免捕获主要群组?

<^(?:([a-z]+)\:([0-9]+)\/?.*)$>

上述模式仍将整个字符串'localhost:8080'放入第一个(0)组。但我只需要获得2个匹配的组,因此第一个(0)组填充'localhost',第二个(1)填充'8080'。

我在哪里弄错了?

5 个答案:

答案 0 :(得分:3)

第一组0将始终是整场比赛。

答案 1 :(得分:1)

这就是正则表达式功能的工作方式。第一组始终是整场比赛。您可以使用array_shift来摆脱它。

http://www.php.net/manual/en/function.array-shift.php

答案 2 :(得分:1)

在正则表达式中,$ 0始终等于匹配字符串而不是其中一个分组。匹配组总是从1美元开始。所以看看1美元和2美元而不是0美元和1美元。

答案 3 :(得分:1)

如果您正在处理网址,可以尝试使用PEAR NetURL,或者在这种情况下可能更适合您的是parse-url()

的print_r(parse_url($ URL));

答案 4 :(得分:1)

来自docs

  

匹配

     

如果提供了匹配,那么它将填充搜索结果。 $ matches [0]将包含与完整模式匹配的文本,$ matches [1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。

如果您不关心完整匹配,可以使用array_shift()删除不需要的元素。

array_shift($matches);