#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"]
Спасибо за совет