Update/Примечание:
Я думаю, что я, вероятно, ищу, чтобы получить захваты группы в PHP.
Ссылка: Регулярные выражения PCRE с использованием подпрограмм named pattern.
(Читайте внимательно:)
У меня есть строка, содержащая переменное число сегментов (упрощенная):
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
Я хотел бы теперь совместить сегменты и возвращать их через массив совпадений:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
Это вернет только последнее совпадение для группы захвата 2: DD
.
Есть ли способ, с помощью которого можно получить все подматричные записи (AA
, BB
, DD
) с одним выполнением регулярных выражений? Не подходит ли preg_match_all
для этого?
Этот вопрос является обобщением.
Оба $subject
и $pattern
упрощаются. Естественно, что с таким общим списком AA
, BB
,... гораздо проще извлекать другие функции (например, explode
) или с изменением $pattern
.
Но я специально спрашиваю, как вернуть все совпадения подгрупп с preg_...
-семейством функций.
Для реального жизненного случая представьте, что у вас есть несколько (вложенных) уровней варианта соответствия подшаблонов.
Пример
Это пример в псевдокоде, чтобы описать немного фона. Представьте себе следующее:
Регулярные определения токенов:
CHARS := [a-z]+
PUNCT := [.,!?]
WS := [ ]
$subject
получают на основе этих токенов. Маркировка хранится внутри массива токенов (тип, смещение,...).
Затем этот массив преобразуется в строку, содержащую один символ для токена:
CHARS -> "c"
PUNCT -> "p"
WS -> "s"
Итак, теперь можно запускать регулярные выражения на основе токенов (а не классов символов и т.д.) в индексе строки потока токенов. Например.
regex: (cs)?cp
чтобы выразить одну или несколько групп символов, за которыми следует пунктуация.
Как я теперь могу выразить самоопределяемые токены как регулярное выражение, следующим шагом было построение грамматики. Это всего лишь пример, это своего рода стиль ABNF:
words = word | (word space)+ word
word = CHARS+
space = WS
punctuation = PUNCT
Если я сейчас скомпилирую грамматику для слов в регулярное выражение (токен), я бы хотел, чтобы все подгруппы соответствовали каждому слову.
words = (CHARS+) | ( (CHARS+) WS )+ (CHARS+) # words resolved to tokens
words = (c+)|((c+)s)+c+ # words resolved to regex
Я мог бы написать код до этого момента. Затем я столкнулся с проблемой, что совпадения подгрупп содержали только их последнее совпадение.
Итак, у меня есть возможность либо самостоятельно создать автоматы для грамматики (что я хотел бы предотвратить, чтобы сохранить общие грамматические выражения), либо несколько сделать preg_match для меня каким-то образом, поэтому я могу это сэкономить.
Это в основном все. Вероятно, теперь понятно, почему я упростил вопрос.
по теме: