Все большое спасибо. Написал хелпер используя вот этот вариант:
$s = 'Пользователь {user_240} сделал {action_32} а пользователь {user_123} сделал {action_554}! ';
preg_match_all ('~{(user|action)_(\d+)}~Ui',$s,$tmp);
print_r($tmp);
@nepster09 Тогда сделайте два отдельных регекспа. Это проще и чище, чем городить один универсальный. Разбирать через полгода код с лютыми регекспами - то ещё развлечение.
2 варианта Вам на выбор
1) выдирать user, action итд отдельными регулярками
2) выдрать единой регуляркой {(user|action)_(\d+)} и далее парсить в php в цикле
$s = 'Пользователь {user_240} сделал {action_32} а пользователь {user_123} сделал {action_554}! ';
preg_match_all ('~{(user|action)_(\d+)}~Ui',$s,$tmp);
print_r($tmp);
А еще можно найти через strpos позиции "user_" или "action_" и "}" от этих позиций, и используя substr отрезать id, предварительно вычислив длину отрезаемой строки как разницу между скобкой и "user_" или "action_". Тогда регулярки не нужны.
Мне кажется регулярки стоит использовать там, где нельзя простым способом выудить данные, так как они тяжеловеснее и медленнее. Сложная верстка, например, где нельзя явно проследить правило повторения тех или иных значений. Ну или более сложные выборки с большим количеством вариаций значений, таких как телефоны с разным положением скобок и так далее.
В данном же случае все довольно просто и единственное отличие в шаблоне - это длина id, которая как раз и вычисляется как "положение фигурной скобки" - "положение underscore".
Ну и еще у меня осталась в памяти одна фраза - "Если вы собрались решить одну проблему с помощью регулярных выражений, то теперь у вас уже две проблемы".
Хотя сам одно время очень любил регулярки и использовал везде, где это можно было сделать, что сказывалось на быстродействии..