【问题标题】:Regex with Dirname带有目录名的正则表达式
【发布时间】:2016-05-19 18:39:47
【问题描述】:

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

我为我编写了一个 Templete 引擎。 现在我想让我可以编写 @include(public/server/logik01/logik_web_init.php) 并且类包含该文件并删除 @include(....) 标记。

这是我的代码

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 很好,但 @include(public/server/logik01/logik_web_init.php) 我不能用 preg_replace 覆盖

【问题讨论】:

  • @include\((?P<include>[^)]+)\) 上的个人 id 匹配,但这只是我,regex101.com/r/iC9kJ9/1 为您节省大约 6 行代码。
  • 感谢您的快速回答。我必须在哪个地方写这个@include\((?P<include>[^)]+)\)
  • 回答您的问题,您可能需要在 preg 替换中添加 preg_quote($include) 以避开那些讨厌的斜线和点。
  • 原始的preg_match_all,然后你只需匹配并捕获你需要的,路径。

标签: php regex template-engine


【解决方案1】:

而不是

 preg_match_all('/@include.*/', self::$viewMainContent, $include);

试试这个

preg_match_all('/@include\((?P<include>[^)]+)\)/', '@include(public/server/logik01/logik_web_init.php)', $include);

结果

include [9-49]  => `public/server/logik01/logik_web_init.php`

然后你可以跳过所有的混乱,只做这样的事情

要清楚你可以做这样的事情

 $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 的匹配项,而是使用包含文件的内容。

为此你需要这样做

ob_start();

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

$content = ob_get_clean();

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

类似的东西

 $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而不是include,然后在处理任何其他标签的模板之前执行所有这些操作,这将排除在包含的模板文件中使用php并且您不需要输出缓冲ob_*函数..

像这样..

 $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% 正确但应该让你走上正确的道路,我没有对此进行测试非常抱歉。

【讨论】:

  • 我有你最后一个代码的 testet 并且包含工作但 @include(/home/vagrant/Cloud/LogikServer/lizenzierung/public/server/logik01/logik_web_init.php) 不远离浏览器。
  • 这不是你想做的一件容易的事……我写了几个模板引擎,
  • 啊抱歉,我要包含的文件是一个带有函数的 php 文件。对于 html 文件,我有另一个类。喜欢我的帖子
  • 那么,如果要捕获输出,则需要输出缓冲。否则只需要使用它。
  • 感谢您的帮助。它还没有工作,但我正在努力:-)
【解决方案2】:

谢谢

模板代码是这样的。

<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

现在可以使用此代码

$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);
}

【讨论】:

  • '/'.preg_quote($include).'/' 注意前导 / 和尾随。
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2017-11-14
相关资源
最近更新 更多