带目录名的正则表达式
Regex with Dirname
对不起,我的英语不好,但我想问一个问题。
我为我写了一个 Templete 引擎。
现在我想让我可以写 @include(public/server/logik01/logik_web_init.php)
和 Class 包含那个文件并删除 @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
覆盖
而不是
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]);
}
在任何情况下,include 都不起作用,因为您不想将内容替换为 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% 正确,我深表歉意,但应该会让您走上正确的道路。
感谢
模板代码是这样的
<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);
}
对不起,我的英语不好,但我想问一个问题。
我为我写了一个 Templete 引擎。
现在我想让我可以写 @include(public/server/logik01/logik_web_init.php)
和 Class 包含那个文件并删除 @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
而不是
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]);
}
在任何情况下,include 都不起作用,因为您不想将内容替换为 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% 正确,我深表歉意,但应该会让您走上正确的道路。
感谢
模板代码是这样的
<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);
}