@nevesomostjke

Как сделать регулярное выражение?

Здравствуйте, у меня такая задача:
У меня есть строка [string] * [string] * 0.2

Мне нужно с помощью регулярок взять значения внутри квадратных скобок
Строка также может выглядить как: 0.3+[string]*2

Это калькулятор, где в квадратных скобках я подставляю определенные свои формулы.
У меня есть решение такое:
$formula = preg_match_all('/\[(.+?)\]/', $request->formula, $matches);

На выходе я получаю массивы:
Array
(
    [0] => Array
        (
            [0] => [string1]
            [1] => [string2]
        )

    [1] => Array
        (
            [0] => string1
            [1] => string2
        )

)

Совсем не понимаю, как сложить например 2 значения string1 и string2. Как определить какой математический символ стоит между двумя квадратными скобками?
В качестве калькулятора использую эту библиотеку: https://github.com/chriskonnertz/string-calc

Заранее спасибо за помощь!
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
// шаблон в формуле
$pattern = '[string] * [string] * 0.2';
// определяем число плейсхолдеров - подстановочных мест для параметров
$placeholder_count = substr_count($pattern, '[string]');
$input_params = []; // массив входных параметров
// заполняем массив входных параметров по кол-ву подстановочных мест
for($i = 0; $i < $placeholder_count; $i++)
{
  // имитация процесса получения входных параметров из другого источника
  $input_params[] = floatval('1.32453' + $i);
  // если параметры получают в виде строковых значений,
  // то их нужно обязательно пропускать через функции floatval или intval,
  // чтобы экранировать значения и недопустить попадания в шаблон чего-то,
  // кроме целых или вещественных чисел
}
// создаем выходной шаблон для подстановки параметров
$out_pattern = $pattern;
// производим подстановку параметров из массива
for($i = 0; $i < $placeholder_count; $i++)
{
  $out_pattern = str_replace('[string]', $input_params[$i], $out_pattern);  
}
// выполняем выходной шаблон как строку кода PHP.
// Результат выполнения спроецируется в переменную $exec_result
eval('$exec_result = '.$out_pattern.';');
// смотрим пошагово, что происходит
echo 'pattern: '.$pattern."\n";
echo 'placeholder_count: '.$placeholder_count."\n";
echo 'input_params: '.print_r($input_params, true)."\n";
echo 'out_pattern: '.$out_pattern."\n";
echo 'exec_result: '.$exec_result."\n";
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы