Регулярное выражение для поиска названия функции
Есть, например, такая строка Ты{@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;