Сначала вы должны удалить * после {,} и (\ w +).
'/(.+)\:(.+)\{(\w+)\}/'
Дает
array(4) {
[0]=>
string(18) "a1\'):a2\'){a1234}"
[1]=>
string(5) "a1\')"
[2]=>
string(5) "a2\')"
[3]=>
string(5) "a1234"
}
* означает 0, 1 или несколько, и PCRE пытаетсячтобы найти самый быстрый маршрут, который он может сделать, поэтому, если вы сделаете всю третью часть необязательной (используя * везде), тогда самый быстрый путь - это включить все во вторую группу и пропустить третью, поэтому ваш код не работает.
Теперь, чтобы разобраться с тем фактом, что третья часть является необязательной, вы должны использовать позитивный взгляд: во второй группе вы попросите pcre выбрать его, только если он может соответствовать другому регулярному выражению после него.,Последнее регулярное выражение таково:
'/(.+)\:(.+(?=(?:(?<=[^}])$|\{(\w+)\})))/'
То, что я изменил, таково:
во второй группе, я добавил положительный взгляд в форму (? = Regex).Как сказано, это означает, что оно должно совпадать.Lookahead не являются выборочными по умолчанию, это означает, что они не создают запись в вашем конечном результате / они не возвращаются вам.
внутри этого lookahead, я создал два случая,это означает, что для сопоставления. + из второй группы должен соответствовать любому случаю моего просмотра.
Первый случай очень простой, это означает, что конец строки неперед ним} будет соответствовать строка, когда 3-й части нет
во втором случае, если вы выбираете 3-ю группу, мы делаем ее выбираемой так, чтобы она была возвращенав результатах, если присутствует