繁体   English   中英

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

[英]How do I avoid capturing the primary group of a given regex pattern?

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

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

如何避免占领主要人群?

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

上面的模式仍然会将整个字符串'localhost:8080'放入第一个(0)组。 但是我只需要获得2个匹配的组,以便第一个(0)组填充为'localhost',第二个(1)填充为'8080'。

我在哪里弄错了?

第一组0将始终是整个匹配项。

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

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

在正则表达式中,$ 0始终等于匹配字符串,而不是分组之一。 比赛组的总起价为$ 1。 因此,请看$ 1和$ 2而不是$ 0和$ 1。

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

print_r(parse_url($ url));

文档

火柴

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

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

array_shift($matches);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM