将文件加载为包含变量定义的字符串

时间:2014-11-16 22:28:10

标签: php file-get-contents

我在PHP中尝试做的是加载包含php样式变量的文件,并将其替换为变量的内容。这是我的示例代码,它不会影响我的意图。

module.html

<div class="module">
    $moduleText
</div>

的index.php

<?php 
$moduleText = "Hello, World!";
$module = file_get_contents ( "module.html" );
echo $module;
?>

index.php输出

<div class="module">
    $moduleText
</div>

index.php期望输出

<div class="module">
    Hello, World!
</div>

在PHP中有一种简单的方法可以获得所需的输出吗?我正在构建一个CMS,这将使我的模块包含变得轻而易举。任何帮助,讽刺评论或正确方向的点都非常感谢!!

3 个答案:

答案 0 :(得分:2)

您可以使用Heredoc string

执行此操作

让我举个例子:

的index.php

<?php 
$moduleText = "Hello, World!";
include "module.php";
echo $module;
?>

module.php

<?php 
$module = <<<EOD
<div class="module">
    $moduleText
</div>
EOD;
?>

您可以在任何循环中执行此操作,它将按预期运行。

希望这有帮助!

答案 1 :(得分:0)

我最终创建了一个模板系统。如果您在遵循我的示例目录结构的同时复制并粘贴它,代码应该可以工作。

如果您有任何问题或替代方法,请与我们联系。我总是乐于改进。 :)

示例目录结构:

- templates
---- index.html
---- module.html
- includes
---- functions.php
- index.php

的index.html:

<b>${myVariable}</b>
<div>
    ${module}
</div>

module.html:

<b>${foo}</b>
<i>${bar}</i>

的functions.php:

<?php 

function getTemplate($file, $hooks){
    //Read our template in as a string.
    $template = file_get_contents($file);

    $keys = array();
    $data = array();
    foreach($hooks as $key => $value){
        array_push($keys, '${'. $key .'}');
        array_push($data,  $value );
    }

    //Replace all of the variables with the variable
    //values.
    $template = str_replace($keys, $data, $template);

    return $template;
}

?>

的index.php:

<?php

require_once('includes/functions.php');

/* 
 * Load Modules First so we can get the 
 * contents as a string and include that string
 * into another template represented by a 
 * variable in the template such as 
 * ${module}
 */ 
$moduleHooks = array(
    'foo' => 'Oh fooey',
    'bar' => 'Chocolate Bar'
);
$moduleTemplate= 'templates/module.html';
$moduleText = getTemplate($moduleTemplate, $moduleHooks);

/*
 * Load the module you want to display. Be sure
 * to set the contents of the contents to a hook
 * in the module that we will display
 */
$indexHooks = array(
    'myVariable' => 'Index Variable',
    'module' => $moduleText 
);

$indexTemplate = 'templates/index.html';
$indexText = getTemplate($indexTemplate, $indexHooks);

/*
 * Finally Display the page
 */
echo $indexText;

?>

输出:

<b>Index Variable</b>
<div>
    <b>Oh fooey</b><i>Chocolate Bar</i>
</div>

我使用包含的问题是,当我使用说“include module.html;”时,我无法决定将其放在index.html文件中的位置,除非我将index.html转换为php文件。

答案 2 :(得分:0)

是的,这是可能的至今,使所有模板库成为过去。

对于像我一样正在寻找这个问题的人:

  

将文件加载为包含变量定义的字符串

答案很简单:

  1. 使用您要输出的文字设置文件,例如一个html文件
  2. 代替你的php vars在你的文件中写下<?php echo $myvar ?>
  3. 使用上述变量设置 php 文件,并在范围内 启动输出缓冲,收集结果并关闭缓冲区{{3提出建议
  4. 在相同的范围内使用收集的结果在实际发送到输出之前做任何你想做的事情,最后,
  5. 请勿忘记使用相同的变量名称来共享这两个文件。
  6. 我将以 CSRF保护(!)

    为例

    <强> form.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="utf-8">
       <title>Form Template</title>
       <meta name="viewport" content="width=device-width, initial-scale=1">
       <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
       <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
       <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-social/5.1.1/bootstrap-social.min.css" />
       <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container-fluid">
    <div class="row">
    <div class="col-xs-12 col-xs-offset-0 col-sm-8 col-sm-offset-2">
        <form method="POST" action="" novalidate="novalidate">
            <div class="form-group">
               <label for="email" class="control-label">Email</label>
               <div class="input-group">
                  <label for="email" class="input-group-addon" aria-hidden="true"><i class="fa fa-at fa-lg"></i></label>
                  <input type="text" class="form-control" id="email" name="email" value="" required="" title="Please enter your email" placeholder="example@gmail.com">
               </div>
               <span class="error help-block">Not acceptable domain</span>
            </div>
            <div class="form-group">
               <label for="password" class="control-label">Password</label>
               <div class="input-group">
                  <label for="password" class="input-group-addon" aria-hidden="true"><i class="fa fa-lock fa-lg"></i></label>
                  <input type="password" class="form-control" id="password" name="password" value="" required="" title="Please enter your password">
               </div>
               <span class="error help-block">Wrong password</span>
               <p><a href="/auth/newpass">Forgot password?</a></p>
            </div>
            <input type='hidden' name='csrf' value="<?php echo $arg[0] ?>">
            <button class="btn btn-primary btn-block">Sign in</button>
            <button class="btn btn-default btn-block">Cancel</button>
        </form>
    </div>
    </div>
    </div>
    </body>
    </html>
    

    特别感兴趣的是行

    <input type='hidden' name='csrf' value="<?php echo $arg[0] ?>">
    

    <强>的template.php

    session_start();
    $csrf = $_SESSION['csrf']; //session stores the value
    $arg = array($csrf);
    ob_start();
       include './form.html';
       $include = ob_get_contents();
    ob_end_clean();
    
    // do whatever you want with $include
    
    echo $include; // the page is rendered correctly!
    

    我们实现了:

      使用在客户端视图和服务器代码之间
    1. 分离
    2. 干净界面的帮助,以协助服务器和客户端双方的通信,以便设计人员不需要知道php开发人员,反之亦然(这里我使用了数组{{ 1}}来帮助他们)
    3. 优于已有的php核心功能this

      3.1。它意味着解决不同的问题

      3.2。它使用一个缓冲区,而在这里我们控制缓冲区并避免一个缓冲区在回显页面时引入的延迟。

    4. 希望能帮助有人找这个。