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

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

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

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

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

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

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


person Aleksandr Makov    schedule 10.02.2012    source источник
comment
Почему вы используете крайние скобки?   -  person Matt Gibson    schedule 10.02.2012
comment
Но почему нет? Они хорошо поддерживаются, и мой фактический шаблон не ожидает ни одного из этих символов.   -  person Aleksandr Makov    schedule 10.02.2012
comment
Вещи внутри квадратных скобок могут быть помещены в массив совпадений, что может быть причиной, если вы не используете PHP. Здесь, однако, это просто артефакт того, как PHP работает с сопоставлением - первый элемент массива соответствия всегда является целым, как указывали другие авторы.   -  person Matt Gibson    schedule 10.02.2012
comment
вы могли бы рассмотреть возможность принятия одного из ответов в качестве правильного ответа, если бы мы могли вам помочь.   -  person Kaii    schedule 10.02.2012


Ответы (5)


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

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

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

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

array_shift($matches);
person Kaii    schedule 10.02.2012
comment
Вздох, теперь я вижу это, я читал блок возвращаемого значения. В любом случае большое спасибо. - person Aleksandr Makov; 10.02.2012

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

person Bart Kiers    schedule 10.02.2012

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

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

person kitti    schedule 10.02.2012
comment
Спасибо. Я бы хотел, чтобы ссылка PHP для preg_match была более информативной по возвращаемому значению шаблона с несколькими группами символов. - person Aleksandr Makov; 10.02.2012
comment
@АлександрМаков: это так. посмотри мой ответ - person Kaii; 10.02.2012

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

person Hersha    schedule 10.02.2012

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

print_r (parse_url ($ URL));

person earthmeLon    schedule 10.02.2012