Захват шаблона неизвестной репликации в PCRE

64
7

Это может быть быстрый вопрос для опытных регулярных экспрессионистов, но у меня возникают проблемы с правильной работой моего матча.


Предположим, что у меня была строка, которая выглядела так:


http://aaa-bbbb-cc-ddddd-eee-.sub.dom

Я хотел бы захватить все подстроки "aaa", "bbbb", "cc" и "ddddd", но я не уверен, сколько их будет (например, все триплеты будут проходить через "ZZZ" ).


Это регулярное выражение, которое я пытаюсь использовать прямо сейчас:


/http:\/\/(\w*?\-)+\.sub\.dom/

Я написал это так, потому что:


    Я хочу совместить подстроки, но я хочу, чтобы каждый заканчивался, когда a - анализируется
    Я хочу захватить одну или несколько из этих подстрок

Но, похоже, только сохранение последнего совпадения, которое оно делает (в приведенном выше случае оно будет соответствовать только "eee -".


Есть ли хороший способ захватить все подстрочные подстроки?


Дополнительная информация: Я использую функцию PHP PCRE preg_replace_callback. Спасибо!

спросил(а) 2011-08-17T19:17:00+04:00 8 лет, 3 месяца назад
2
Решение
71

Нет, невозможно сопоставить неизвестное количество групп захвата.


Если вы попытаетесь повторить группу захвата, она всегда будет содержать последнее зафиксированное значение.

Не могли бы вы немного объяснить, что вы пытаетесь сделать? Возможно, есть еще один простой способ сделать это (возможно, без регулярных выражений).

ответил(а) 2011-08-17T19:20:00+04:00 8 лет, 3 месяца назад
Еще 1 ответ
54

Если вы хотите элементы в субдомене, а затем все совпадения между штрихами... Это должно работать:


$string = "http://aaa-bbbb-cc-ddddd-eee-.sub.dom";

preg_match("/^http:\/\/([\w-]+?)\..*$/i", $string, $match);

$parts = explode('-', $match[1]);

print_r($parts);

Короче, вам, вероятно, придется построить небольшой синтаксический анализ script, чтобы самостоятельно проанализировать строку, если это не делает ее для вас.

ответил(а) 2011-08-17T19:33:00+04:00 8 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема