Как мне избежать захвата основной группы заданного шаблона регулярных выражений? - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть шаблон регулярного выражения:

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

Как мне избежать захвата основной группы?

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

Приведенный выше шаблон все равно поместит всю строку 'localhost: 8080'в первую (0) группу.Но мне нужно получить только 2 подходящие группы, чтобы первая (0) группа заполнялась 'localhost', а вторая (1) - '8080'.

Где я допустил ошибку?

Ответы [ 5 ]

3 голосов
/ 10 февраля 2012

Первая группа, 0, всегда будет соответствовать целиком.

1 голос
/ 10 февраля 2012

из документов :

соответствует

Если совпадения предоставлены, то он заполняется результатами поиска. $ match [0] будет содержать текст, который соответствует полному шаблону, $ match [1] будет иметь текст, который соответствует первому захваченному заключенному в скобки подшаблону и т. д.

если вас не интересует полное совпадение, вы можете использовать array_shift() для удаления нежелательного элемента.

array_shift($matches);
1 голос
/ 10 февраля 2012

Если вы имеете дело с URL-адресами, вы можете попробовать использовать PEAR NetURL, или в этом случае вам будет лучше: parse-url ()

print_r (parse_url ($ URL));

1 голос
/ 10 февраля 2012

В регулярном выражении $ 0 всегда равно строке соответствия, а не одной из группировок.Матчевые группы всегда начинаются с $ 1.Посмотрите на 1 и 2 доллара вместо 0 и 1 доллара.

1 голос
/ 10 февраля 2012

Так работают функции регулярных выражений.Первая группа - это всегда весь матч.Вы можете использовать array_shift, чтобы избавиться от него.

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

...