2016-05-19 5 views
0

Извините за мой плохой английский, но я хочу задать вопрос.Regex with Dirname

Я пишу двигатель 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(public/server/logik01/logik_web_init.php) я не могу переопределить с preg_replace

+0

лично соответствовать идентификатору на этом '@include \ ((? P [^)] +) \) ', но это только я, https://regex101.com/r/iC9kJ9/1 сэкономит вам около 6 строк кода. – ArtisticPhoenix

+0

Thx для быстрого ответа. На каком месте я должен написать этот '@include \ ((? P [^)] +) \)' – Neonlight

+0

, чтобы ответить на ваш вопрос, вы можете добавить 'preg_quote ($ include)' в замену preg, чтобы избежать этих скверны и точки. – ArtisticPhoenix

ответ

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` 

Th ан вы можете пропустить весь беспорядок и просто сделать что-то вроде этого

Чтобы быть ясно, что вы можете просто сделать что-то вроде этого

$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 вместо включения, а затем сделайте все это, прежде чем обрабатывать шаблон для любых других тегов, что wo пакетирования исключающей с использованием 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% правильно но должен привести вас к правильной дороге.

+0

У меня есть testet с вашим последним кодом, а include работает, но '@include (/home/vagrant/Cloud/LogikServer/lizenzierung/public/server/logik01/logik_web_init.php)' не находится далеко от браузера. – Neonlight

+0

Это непростая вещь, которую вы пытаетесь сделать ... Я написал несколько движков шаблонов: – ArtisticPhoenix

+0

ah извините, файл, который я бы включил, - это php-файл с функциями. Для html-файлов у меня есть другой класс. как на моем посте – Neonlight

0

Thx

Код шаблона подобен этому.

<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); 
} 
+0

''/'. Preg_quote ($ include).'/''Обратите внимание на ведущие'/'и trailing. – ArtisticPhoenix