Преобразование preg_replace в preg_replace_match для поиска и замены слов переменными - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующая строка кода:

$message = preg_replace('/\{\{([a-zA-Z_-]+)\}\}/e', "$$1", $body);

Это заменяет слова, заключенные в две фигурные скобки, переменными с одинаковыми именами.т.е. {{username}} заменяется на $ username.

Я пытаюсь преобразовать его для использования preg_replace_callback.Это мой код, основанный на Google, но я не совсем уверен, что я делаю!Выходные данные error_log показывают имя переменной, включая фигурные скобки.

$message = preg_replace_callback(
    "/\{\{([a-zA-Z_-]+)\}\}/",
        function($match){
            error_log($match[0]);
            return $$match[0];
        },
        $body
);

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 20 декабря 2018

Функции имеют собственную область видимости переменных в PHP, поэтому все, что вы пытаетесь заменить, не доступно внутри функции, если вы не сделаете это явно.Я бы порекомендовал поместить ваши замены в массив вместо отдельных переменных.У этого есть два преимущества: во-первых, он позволяет легко помещать их в область действия функции, а во-вторых, он обеспечивает встроенный механизм внесения в белый список, чтобы ваши шаблоны не могли случайно (или намеренно) ссылаться на переменные, которые не должныподвергается.

// Don't do this:
$foo = 'FOO';
$bar = 'BAR';

// Instead do this:
$replacements = [
    'foo' => 'FOO',
    'bar' => 'BAR',
];

// Now, only things inside the $replacements array can be replaced.

$template = 'this {{foo}} is a {{bar}} and here is {{baz}}';
$message = preg_replace_callback(
    '/\{\{([a-zA-Z_-]+)\}\}/',
    function($match) use ($replacements) {
        return $replacements[$match[1]] ?? '__ERROR__';
    },
    $template
);

echo "$message\n";

Это дает:

this FOO is a BAR and here is __ERROR__
...