Регулярное выражение для поиска названия функции

Есть, например, такая строка Ты{@rand(, я думаю random,| скорее всего|, должно быть,)} человек Мне нужно:

  • найти название функции - rand
  • забрать в массив параметры, то есть explode('|', ', я думаю random,| скорее всего|, должно быть,')

С пробовал написать такой код

<?php

$message = "Ты{@rand(, я думаю random,| скорее всего|, должно быть,)} человек";

preg_match_all('/\s*\{@rand\(.+\)\}/ui', $message, $variants);

foreach($variants[0] as $funcCall) {
  $funcName = trim(preg_replace('/[^@a-z]/ui', '', $funcCall), '@()');

  echo $funcName;

  $arguments = explode('|', trim(preg_replace("/[\{\}@\(\)$funcName]/ui", '', $funcCall)));
  print_r($arguments);
}

Это работает, но если в параметрах нет английских символов. Насколько я понял, чтобы ограничить до этой скобки перед параметрами, нужно использовать ?=\( Я пробовал /[^@a-z?=\(]/ui, но это не работает так, как я задумал -_-

Как ограничить область до знака ( ?


Ответы (1 шт):

Автор решения: teran

несколько, забегая вперед, вы в результате то что-то такое хотите получить?

$str = "Ты{@rand(, я думаю random,| скорее всего|, должно быть,)} человек.";;

$result = preg_replace_callback('/{@rand\((?<params>.+?)\)}/i', function($m){
                $params = explode('|', $m['params']);
                
                return $params[rand(0, count($params) - 1)];
                
            }, $str);
            
echo $result;
→ Ссылка