Как создать динамическую группу захвата в regex?
у меня есть строка, как это:
$str ="
- group1
- group2
- group3
";
также у меня есть это выражение:
/(-sw+)n(-sw+)n(-sw+)/
как вы знаете, есть три группы захвата:,
и
. Я сделал эту группу вручную. Я имею в виду, если я добавлю это к строке выше:
- group4
- group5
тогда это регулярное выражение не соответствует им.
Ну, у меня постоянная закономерность:(-sw+)
, и я хочу создать отдельную группу захвата по количеству элементы в строке. Заяц приводит несколько примеров:
Пример 1:
$str="
- group 1
";
мне нужно регулярное выражение, чтобы дать мне всю строку .
Пример 2:
$str="
- group 1
- group 2
";
мне нужно регулярное выражение, чтобы дать мне первую строчку строку (- group 1
) by и второй линии (
- group 2
) by
хорошо, как вы видите в приведенных выше примерах, строка динамична, но она соответствует постоянная закономерность ... Теперь я хочу знать, как я могу создать динамическую группу захвата в соответствии со строкой?
2 ответов
невозможность захвата повторяющихся групп-это хорошо известное ограничение.
Если вы знаете максимальный повторяющийся шаблон, вы можете установить регулярное выражение как (т. е. max=5):
/(\-\s\w+)\n(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?/
и вы найдете от одного до пяти матчей в группах от 1 до 5.
По существу, вы должны повторить (\-\s\w+)?\n?
для максимального возможного количества повторяющихся элементов.
В противном случае, если ваш максимальный возможный номер не определен, я не знаю другого способа, чем построить динамический шаблон, как:
$regex = '(\-\s\w+)\n';
$regex = '/'.( str_repeat( $regex, preg_match_all( "/$regex/", $str, $matches ) ) ).'/';
вышеуказанный шаблон будет работать, но я не знаю, что вы точно замените условие, поэтому оно может быть непригодным для вашей цели.
используя M-модификатор (многострочный): это позволит совпадению на каждой строке.
попробуйте использовать ниже regex:
preg_match_all('/(\-\s\w+)/m', $str, $matches);
print_r($matches);