PHP заменит {replace_me} на & lt;? Php include? & Gt; в выходном буфере

У меня есть такой файл

**buffer.php**

ob_start();
<h1>Welcome</h1>

{replace_me_with_working_php_include}

<h2>I got a problem..</h2>
ob_end_flush();

Все внутри буфера динамически создается с данными из базы данных.
И вставка php в базу данных не вариант.

Проблема в том, что у меня есть выходной буфер, и я хочу заменить ‘{replace}’ рабочим включением php, которое включает в себя файл, содержащий также html / php.

Итак, мой актуальный вопрос: Как заменить строку с рабочим php-кодом в выходном буфере?

Я надеюсь, что вы можете помочь, потратили много времени на это.

С наилучшими пожеланиями — user2453885

РЕДАКТИРОВАТЬ — 25/11/14

Я знаю, что WordPress или Joomla используют некоторые подобные функции, вы можете написать {рейтинг} в своем посте, и он заменяет его системой оценки (некоторый плагин для оценки). Это тайное знание, которое я желаю.

0

Решение

Вы можете использовать preg_replace_callback и позволить обратному вызову включать файл, который вы хотите включить, и возвращать вывод. Или вы могли бы заменить заполнители текстовыми включениями, сохранить их как файл и включить этот файл (что-то вроде компиляции)

0

Другие решения

Для простого текста вы могли бы взорваться (хотя это, вероятно, не самый эффективный для больших блоков текста):

function StringSwap($text ="", $rootdir ="", $begin = "{", $end = "}") {
// Explode beginning
$go =   explode($begin,$text);
// Loop through the array
if(is_array($go)) {
foreach($go as $value) {
// Split ends if available
$value  =   explode($end,$value);
// If there is an end, key 0 should be the replacement
if(count($value) > 1) {
// Check if the file exists based on your root
if(is_file($rootdir . $value[0])) {
// If it is a real file, mark it and remove it
$new[]['file']  =   $rootdir . $value[0];
unset($value[0]);
}
// All others set as text
$new[]['txt']   =   implode($value);
}
else
// If not an array, not a file, just assign as text
$new[]['txt']   =   $value;
}
}
// Loop through new array and handle each block as text or include
foreach($new as $block) {
if(isset($block['txt'])) {
echo (is_array($block['txt']))? implode(" ",$block['txt']): $block['txt']." ";
}
elseif(isset($block['file'])) {
include_once($block['file']);
}
}
}

// To use, drop your text in here as a string
// You need to set a root directory so it can map properly
StringSwap($text);
0

Я мог бы неправильно что-то здесь понять, но что-то простое, как это может сработать?

<?php

# Main page (retrieved from the database or wherever into a variable - output buffer example shown)
ob_start();

<h1>Welcome</h1>

{replace_me_with_working_php_include}

<h2>I got a problem..</h2>

$main = ob_get_clean();

# Replacement
ob_start();

include 'whatever.php';

$replacement = ob_get_clean();echo str_replace('{replace_me_with_working_php_include}', $replacement, $main);

Вы также можете использовать оператор возврата из включаемого файла, если вы хотите удалить выходной буфер из этой задачи.

Удачи!

0

Ты все за какой-то прекрасный вклад.

Я постараюсь ответить на мой собственный вопрос как можно яснее.

проблемаСначала я подумал, что хочу реализовать функцию php или включить ее в буфер. Это, однако, не то, что я хотел, и не предназначено.

Решение: Функция обратного вызова с моим желаемым контентом. Используя функцию preg_replace_callback (), я мог найти текст, который хотел заменить, в своем буфере, а затем заменить его на то, что возвращал бы callback (функция).

Затем обратный вызов включил необходимые файлы / .classes и использовал функции с письменным содержимым в нем.

Скажите, если вы не поняли или хотите уточнить / рассказать больше о моем решении.

0