PHP — заменить формулу php

#php #preg-replace #preg-match

#php #preg-заменить #preg-совпадение

Вопрос:

Я пытаюсь найти оптимальный способ замены всех переменных PHP в строке кода вызовом массива, как показано ниже.

Например, строка исходного кода

 $random_var_name   $random_var_name2 * $diff_var_name3
  

Преобразовано в

 $varArray["random_var_name"]   $varArray["random_var_name2"] * $varArray["diff_var_name3"]
  

Я думал, что preg_replace() это оптимальное решение, но сложность связана с необходимостью выполнения замены с помощью подраздела шаблона поиска.

Возможно, лучше просто извлечь все переменные с помощью a preg_match , отредактировать / обернуть их, а затем выполнить по одному str_replace() для каждой переменной?

Однако это, вероятно, значительно медленнее.

Комментарии:

1. вы хотите выполнить вычисление или только напечатать операцию как есть?

2. Это привело к вычислению формулы с $result = eval($forumula) помощью . Я полагаю, что это быстрее, чем объявление переменных из массива.

3. Зачем eval() вообще нужна?

4. потому что формула в настоящее время находится в переменной, и мне нужен результат теперь, когда у меня есть переменные. Если вы можете каким-то образом манипулировать формулой и получать результат без вызова eval, это здорово.

5. Вот еще один шаблон поиска / замены, который соответствует вашему обновленному вопросу: search: $([a-zA-Z_0-9] ) , replace: $varArray['$1']

Ответ №1:

Следующее регулярное выражение должно делать то, что вы просите:

preg_replace('/$([a-zA-Z_0-9] )/', '$varArray["$1"]', $input_string);

Ответ №2:

Чтобы избежать изменения $var['foo'] на $varArray["var"]['foo'] , вы должны проверить [ , что после имени переменной нет символа. Для этого используйте отрицательный прогноз:

 $string = preg_replace('/$(w )(?![w[])/', '$varArray["$1"]', $string);
  

Комментарии:

1.по какой-то причине это привело к тому же результату, что и предыдущий ответ для меня со следующими настройками: $subject = '$random1['hello'] $var2 * $var3'; $search = '/$(w )(?! [ )/'; $replace = '$varArray["$1"]';

2. @Programster: Извините, я допустил ошибку. Смотрите мою правку.

3. да, это сработало, выдает $random1['hello'] $varArray["var2"] * $varArray["var3"] Спасибо за совет