У меня есть такой файл
**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 используют некоторые подобные функции, вы можете написать {рейтинг} в своем посте, и он заменяет его системой оценки (некоторый плагин для оценки). Это тайное знание, которое я желаю.
Вы можете использовать preg_replace_callback и позволить обратному вызову включать файл, который вы хотите включить, и возвращать вывод. Или вы могли бы заменить заполнители текстовыми включениями, сохранить их как файл и включить этот файл (что-то вроде компиляции)
Для простого текста вы могли бы взорваться (хотя это, вероятно, не самый эффективный для больших блоков текста):
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);
Я мог бы неправильно что-то здесь понять, но что-то простое, как это может сработать?
<?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);
Вы также можете использовать оператор возврата из включаемого файла, если вы хотите удалить выходной буфер из этой задачи.
Удачи!
Ты все за какой-то прекрасный вклад.
Я постараюсь ответить на мой собственный вопрос как можно яснее.
проблемаСначала я подумал, что хочу реализовать функцию php или включить ее в буфер. Это, однако, не то, что я хотел, и не предназначено.
Решение: Функция обратного вызова с моим желаемым контентом. Используя функцию preg_replace_callback (), я мог найти текст, который хотел заменить, в своем буфере, а затем заменить его на то, что возвращал бы callback (функция).
Затем обратный вызов включил необходимые файлы / .classes и использовал функции с письменным содержимым в нем.
Скажите, если вы не поняли или хотите уточнить / рассказать больше о моем решении.