PHP - заменить все {строки} из переменной

0

У меня есть эта переменная:

$content = "Hello {file1}. Welcome to {file2}. Status: {file3}";

Я хочу заменить все {strings} различными файлами include.

Например

{file1} = file1.php
{file2} = file2.php
{file3} = file3.php

Таким образом, конечный вывод $ content включает эти файлы.

Как мне это сделать?

  • 1
    Просто используйте переменные и поместите переменные в строку?
  • 0
    Просто не в тему, но если это действительно ваша переменная, я предполагаю, что ваши строки очень короткие, и я не думаю, что лучше всего хранить небольшие строки в разных файлах.
Показать ещё 8 комментариев
Теги:
str-replace

2 ответа

0
Лучший ответ

Вы можете использовать preg_replace_callback() чтобы идентифицировать заполнители и заменить их чем-то другим:

$content = "Hello {file1}. Welcome to {file2}. Status: {file3}";
$replacements = array(
    '{file1}' => 'file1.php',
    '{file2}' => 'file2.php',
    '{file3}' => 'file3.php',
);

$output = preg_replace_callback(
    '/\{.*?\}/',
    function (array $matches) use ($replacements) {
        $item = $matches[0];
        if (isset($replacements[$item])) {
            // simple replacement: replace the key in $replacements with the value
            $item = $replacements[$item];
        }
        return $item;
    },
    $content
);

В приведенном выше коде "Hello file1.php. Welcome to file2.php. Status: file3.php" строка "Hello file1.php. Welcome to file2.php. Status: file3.php" который вам не нужен, но он показывает вам путь.

Если вы хотите поместить исходное содержимое файла file1.php вместо {file1} aso, тогда используйте функцию file_get_contents() чтобы получить его:

        if (isset($replacements[$item])) {
            // replace with the raw content of the file
            $item = file_get_contents($item);
        }

Если вы хотите include 'file1.php' вам нужно написать небольшую функцию для включения файла и захватить вывод, который он может произвести:

        if (isset($replacements[$item])) {
            // replace with the content produced by the included file
            $item = includeFile($item);
        }

// ... somewhere after the rest of the code...
function includeFile($file)
{
    ob_start();
    include($file);
    return ob_get_clean();
}
  • 0
    ты гений, спасибо
0

Здесь ваш начальный делиметр должен быть "{" и конечным делителем "}", а параметры - это переменные имени файла, собранные в массиве.

while (true) {
            //Find starting delimiter
            $paramStart = strpos($this->_templateText, $this->_delimiters[0], $index);

            //No more starting delimiters. Copy rest of the message and return
            if ($paramStart === false) {
                $message .= substr($this->_templateText, $index);
                break;
            }

            //Copy portion up to the starting delimiter to message
            $message .= substr($this->_templateText, $index, $paramStart-$index);

            //Find ending delimiter
            $paramEnd = strpos($this->_templateText, $this->_delimiters[1], $paramStart + $startDelimiterLength);

            //No matching ending delimiter
            if ($paramEnd === false) {
                break;
            }

            //Get the portion between delimiters (i.e. parameter name)
            $paramName = substr(
                $this->_templateText,
                $paramStart + $startDelimiterLength,
                $paramEnd - ($paramStart + $startDelimiterLength)
            );

            //Insert parameter into message
            if (isset($parameters[$paramName])) {
                $message .= $parameters[$paramName];
            }

            //Continue from where we left off
            $index = $paramEnd + $endDelimiterLength;
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню