首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Dirname的Regex

带Dirname的Regex
EN

Stack Overflow用户
提问于 2016-05-19 18:39:47
回答 2查看 73关注 0票数 0

对不起我的英语不好,但我想问一个问题。

我为我写了一个Templete引擎。现在,我希望能够编写@include(public/server/logik01/logik_web_init.php),类包含该文件并删除@include(....)标记。

这是我的代码

代码语言:javascript
复制
private static function get_include(){
    preg_match_all('/@include.*/', self::$viewMainContent, $include);
    foreach($include[0] as $include){
        $key = explode("(", $include);
        $key = explode(")", $key[1]);
        $include = addcslashes($include, "/");
        $include =  '/'.$include.'/';
        self::$viewMainContent = preg_replace($include, '', self::$viewMainContent);
        require_once($key[0]);
    }
}

self::$viewMainContent中有这个self::$viewMainContent = file_get_contents($viewMain);源代码。

INclude很好,但是我不能用preg_replace覆盖@include(public/server/logik01/logik_web_init.php)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-19 18:53:10

而不是

代码语言:javascript
复制
 preg_match_all('/@include.*/', self::$viewMainContent, $include);

尝尝这个

代码语言:javascript
复制
preg_match_all('/@include\((?P<include>[^)]+)\)/', '@include(public/server/logik01/logik_web_init.php)', $include);

结果

代码语言:javascript
复制
include [9-49]  => `public/server/logik01/logik_web_init.php`

然后你就可以跳过所有的乱七八糟的事情,做这样的事情

说清楚,你可以做这样的事

代码语言:javascript
复制
 $include = array();
 preg_match_all('/@include\((?P<include>[^)]+)\)/', self::$viewMainContent, $include);
    $matches = isset($include['include']) ? count($include['include']) : 0;
    for($i = 0; $i < $matches; $i++) {
        require_once($include['include'][$i]);
    }

在任何情况下,因为您不想用regx的匹配替换内容,而是用包含的文件的内容来替换,所以包含的内容无法工作。

为此,你需要这样做

代码语言:javascript
复制
ob_start();

 require_once($include['include'][$i]);

$content = ob_get_clean();

然后使用完全匹配的$inclue[0]并将其替换为原始模板中包含的内容。

就像这样

代码语言:javascript
复制
 $include = array();
 preg_match_all('/@include\((?P<include>[^)]+)\)/', self::$viewMainContent, $include);
$matches = count($include);
for($i = 0; $i < $matches; $i++) {
    ob_start();
    require_once($include['include'][$i]);
    $content = ob_get_clean();
    self::$viewMainContent = preg_replace('/'.preg_quote($include[0][$i]).'/', $content, self::$viewMainContent);
}

当然,我将使用file_get_contents而不是包含,然后在处理任何其他标记的模板之前执行所有这些操作,这将排除在包含的模板文件中使用php,并且不需要输出缓冲ob_*函数。

像这样..。

代码语言:javascript
复制
 $include = array();
 preg_match_all('/@include\((?P<include>[^)]+)\)/', self::$viewMainContent, $include);
$matches = count($include);
for($i = 0; $i < $matches; $i++) {
    $content = file_get_contents($include['include'][$i]);
    self::$viewMainContent = preg_replace('/'.preg_quote($include[0][$i]).'/', $content, self::$viewMainContent);
}

我还没有测试这个,很抱歉,如果它不是100%正确的,但应该让你走上正确的道路。

票数 1
EN

Stack Overflow用户

发布于 2016-05-19 19:04:11

Thx

模板代码和这个类似。

代码语言:javascript
复制
<html>
<head>
    <title>Test</title>
    <link rel="stylesheet" type="text/css" href="{WEBROOT}/css/bundle.css">
</head>
<body>
  @include({SRVROOT}/public/server/logik01/logik_web_init.php)
  <div id="wrapper">
    <div id="header">
      <div><img src="{WEBROOT}/img/mechtronik_2012.png"></div>
      <div>E-Shop Stromschienen</div>
      <div><a href="#" id="btnLogout"><img src="{WEBROOT}/img/grey_log-out1.png"><span>Logout</span></a></div>
    </div>
    <div id="content">
      <div class="flex">
        <div class="border-panel">
          <legend>Login</legend>
          <button id="startLogik" class="button" name="start">Konfigurator starten</button>
        </div>
      </div>
    </div>
  </div>
  <script type="text/javascript" src="{WEBROOT}/js/logikscripte.js"></script>
</body>

我希望我能多做一次@include

它现在与以下代码一起工作

代码语言:javascript
复制
$include = array();
    preg_match_all('/@include\((?P<include>[^)]+)\)/', self::$viewMainContent, $include);
$matches = isset($include['include']) ? count($include['include']) : 0;
for($i = 0; $i < $matches; $i++) {
        require_once($include['include'][$i]);
        self::$viewMainContent = preg_replace('/'.preg_quote($include[0][$i], '/').'/', '', self::$viewMainContent);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37331553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档