Можно ли создать регулярное выражение, которое читает {variable} как <?php echo $variable ?>
В файлах PHP?
благодаря
Remy
Руководство PHP уже предоставляет регулярное выражение для имен переменных :
[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Вам просто нужно изменить его на это:
\{[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\}
И вы сделали.
Редактировать. Вы должны знать, что простая последовательная замена таких случаев, как предложенный Росс, может вызвать некоторое нежелательное поведение, когда, например, подстановка также содержит такие переменные.
Поэтому вам лучше разобрать код и заменить эти переменные отдельно. Пример:
$tokens = preg_split('/(\{[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); for ($i=1, $n=count($tokens); $i<$n; $i+=2) { $name = substr($tokens[$i], 1, -1); if (isset($variables[$name])) { $tokens[$i] = $variables[$name]; } else { // Error: variable missing } } $string = implode('', $tokens);
Похоже, вы пытаетесь сделать замену переменной шаблона;)
Я бы посоветовал сначала собрать ваши переменные в массиве, а затем использовать что-то вроде:
// Variables are stored in $vars which is an array foreach ($vars as $name => $value) { $str = str_replace('{' . $name . '}', $value, $str); }
{На самом деле не ответ, но нужно уточнение}
Не могли бы вы расширить свой вопрос? Вы хотите применить регулярное выражение к содержимому переменной $?
Следующая строка должна заменить все вхождения строки ' {variable}
' значением глобальной переменной $variable
:
$mystring = preg_replace_callback( '/\{([a-zA-Z][\w\d]+)\}/', create_function('$matches', 'return $GLOBALS[$matches[1]];'), $mystring);
Изменить: замените регулярное выражение, используемое здесь, на упомянутое Gumbo, чтобы точно уловить все возможные имена переменных PHP.
( в комментариях ) Я хочу, чтобы иметь возможность вводить
{variable}
вместо<?php echo $variable ?>
Примитивный подход : вы можете использовать внешнюю программу (например, скрипт Python) для предварительной обработки ваших файлов, делая следующую замену регулярных выражений:
"{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)}"
с
"<?php echo $\g<1> ?>"
Лучший подход : напишите макрос в своей среде IDE или редакторе кода, чтобы автоматически сделать замену для вас.