PHP在输出缓冲区中用<! - ?php include? - >替换{replace_me}

时间:2014-11-25 10:11:05

标签: php include buffer output str-replace

我有一个像这样的文件

**buffer.php**

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

{replace_me_with_working_php_include}

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

缓冲区内的所有内容都是使用数据库中的数据动态生成的。 将php插入数据库不是一种选择。

问题是,我得到了输出缓冲区,我想替换&#39; {replace}&#39;与一个工作的PHP包含,其中包括一个文件,也有一些HTML / PHP。

所以我的实际问题是:如何在输出缓冲区中使用工作的php代码替换字符串?

我希望你能提供帮助,已经习惯了很多时间。

致敬 - user2453885

编辑 - 2014年11月25日

我知道wordpress或joomla正在使用一些类似的功能,你可以在你的帖子中写{rate},并用评级系统(一些rate-plugin)取而代之。这是我所希望的秘密知识。

4 个答案:

答案 0 :(得分:0)

您可以使用preg_replace_callback并让回调包含您要包含的文件并返回输出。或者你可以用文本包含替换占位符,将其保存为文件并包含该文件(编译事物)

答案 1 :(得分: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);

答案 2 :(得分: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);

如果您希望从该任务中删除输出缓冲区,也可以在include文件中使用return语句。

祝你好运!

答案 3 :(得分:0)

所有的一些可爱的输入。

我会尽可能清楚地回答我自己的问题。

问题:我首先想到的是我想实现一个php函数或包含在缓冲区中。然而,这不是我想要的,也不是我想要的。

解决方案:具有所需内容的回调功能。通过使用函数preg_replace_callback(),我可以在缓冲区中找到我想要替换的文本,然后将其替换为回调(函数)将返回的内容。

然后回调包含必要的文件/ .classes并使用带有书面内容的函数。

如果你不理解,或者想详细说明/告诉我有关我的解决方案,请告诉我。