【问题标题】:PHP str_replace twice on output bufferPHP str_replace 在输出缓冲区上两次
【发布时间】:2017-01-19 22:15:15
【问题描述】:

我想在输出缓冲区上执行几个正则表达式,但下面的代码没有产生预期的效果。我想首先执行一个正则表达式来替换任何用“{{”和“}}””括起来的东西,这工作正常,但是我想在之后立即缩小 HTML 输出。

这是我目前所得到的:

<?php
ob_start(function($buffer) {
    $viewfile = join(DIRECTORY_SEPARATOR, array(VIEWS_ROOT, basename(pathinfo(__FILE__)['filename'] . "phtml")));

    if (file_exists($viewfile)) {
        $body = file_get_contents($viewfile);
    } else {
        $body = file_get_contents(join(DIRECTORY_SEPARATOR, array(VIEWS_ROOT, basename("index.phtml"))));
    }

    preg_replace(array("/\>[^\S ]+/s", "/[^\S ]+\</s", "/(\s)+/s"), array(">", "<", "\\1"), ob_get_contents());

    return (str_replace(array("{{title}}", "{{body}}", "/\>[^\S ]+/s", "/[^\S ]+\</s", "/(\s)+/s"), array("Project", $body, ">", "<", "\\1"), $buffer));
});

require_once(join(DIRECTORY_SEPARATOR, array(LAYOUTS_ROOT, "layout.phtml")));

ob_end_flush();
?>

输出是以下文件的合并:

<!DOCTYPE html>
<html lang="en">
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{{title}}</title>
    <link href="css/cosmo.min.css" rel="stylesheet">
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
        <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
    {{body}}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</body>

与:

<h1>Hello, World</h1>

我想要以下输出:

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Project</title><link href="css/cosmo.min.css" rel="stylesheet"><!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]--></head><body><h1>Hello, Julian</h1><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script><script src="js/bootstrap.min.js"></script></body></html>

【问题讨论】:

  • 您应该在 put 中提供一个示例以及相关的所需输出。
  • @Patrick Q - 完成

标签: php output buffer


【解决方案1】:

为了获得所需的输出,我将上面的 return 语句替换为以下内容:

return (preg_replace(array("/\>[^\S]+/s", "/[^\S]+\</s", "/(\s)+/s"), array(">", "<", "\\1"), str_replace(array("{{title}}", "{{body}}"), array("Project", $body), $buffer)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多