我有一个正则表达式模式:
<^(([a-z]+)\:([0-9]+)\/?.*)$>
如何避免捕获主要群组?
<^(?:([a-z]+)\:([0-9]+)\/?.*)$>
上述模式仍将整个字符串'localhost:8080'放入第一个(0)组。但我只需要获得2个匹配的组,因此第一个(0)组填充'localhost',第二个(1)填充'8080'。
我在哪里弄错了?
答案 0 :(得分:3)
第一组0将始终是整场比赛。
答案 1 :(得分:1)
这就是正则表达式功能的工作方式。第一组始终是整场比赛。您可以使用array_shift
来摆脱它。
答案 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);