是的,我知道我正在重新发明轮子,但我不想使用框架或模板系统。
想法:
$layout['default']
,$layout['twocolumn']
等$layouts
preg_match
个简码,即。 {MODULEAREA=1}
$module
$layout['default']
,其中包含所有html并更换了短代码注意:页眉和页脚将是index.php中“包含”的单独文件
这是我到目前为止所拥有的:
它有时会替换短代码但会删除所有的html,理想情况下我想替换短代码并使用新内容返回html。
$layout = '
<div class="module_area_one">
{MODULEAREA=1}
</div>
<div class="module_area_two">
{MODULEAREA=2}
</div>
<div class="module_area_three">
{MODULEAREA=3}
</div>
';
foreach(parselayout($layout, TRUE) as $module) {
$row = $dmodule->getModuleByModuleArea($module);
echo '
<div class="module_wrap">
<div class="module_title">'.$row[0]['module_title'].'</div>
<div class="module_body">'.$row[0]['module_body'].'</div>
</div>
';
}
function parselayout($layout, $check = FALSE) {
$tmp = explode("\n", $layout);
$str = array();
for ($c = 0, $cnt = count($tmp); $c < $cnt; $c++) {
if (preg_match("/[\{|\}]/", $tmp[$c])) {
if ($check) {
if (strstr($tmp[$c], "{MODULE=")) {
$matches = array();
preg_match_all("/\{MODULE=([\d]{1,3})(:[\w\d]*)?\}/", $tmp[$c], $matches);
if(!$matches){
return;
}
foreach ($matches[1] as $match) {
$ret[] = $match;
}
}
}
}
else {
if (!$check) {
echo $tmp[$c];
}
}
}
if ($check) {
return $str;
}
}
public function getModuleByModuleArea($moduleMenuArea) {
$query = "SELECT module_title, module_name, module_body FROM wcx_modules WHERE module_menu_area=:module_menu_area AND module_active=1";
$stmt = $this->queryIt($query);
$stmt = $this->bind(':module_menu_area', $moduleMenuArea);
return $this->resultset();
}
更新
好的,所以我更接近了,下面的代码返回各自位置的模块,但它只显示了一个模块,它重复了所有3个菜单,你能看到错误吗。
我仍然需要弄清楚如何添加$ layout ['default'] ='';同样。
preg_match_all:
$pattern = '/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/';
preg_match_all($pattern, $text, $matches);
//print_r($matches[1]);
foreach($matches[1] as $menu) {
$row = $dmodule->getModuleByModuleArea($menu);
$module = '
<div class="module_wrap">
<div class="module_title">'.$row[0]['module_title'].'</div>
<div class="module_body">'.$row[0]['module_body'].'</div>
</div>
';
}
$text = preg_replace($pattern, $module, $text);
echo $text;
字符串:
$text = "
<div id='wrapper'>
<div id='maincontainer'>
<div id='leftcolumn'>
{MENU=1}
</div>
<div id='contentcolumn'>
{MENU=3}
</div>
<div id='rightcolumn'>
{MENU=2}
</div>
</div>
</div>
<div id='footer'>
<div id='footer_disclaim'>
</div>
</div>
";
答案 0 :(得分:2)
你的问题是:
preg_match_all($pattern, $text, $matches);
foreach($matches[1] as $menu) {
$row = $dmodule->getModuleByModuleArea($menu);
$module = 'Simplified for readability';
}
// Now $module holds the last value calculated in the
// foreach-loop, and you are replacing all matches
// with that value.
$text = preg_replace($pattern, $module, $text);
你应该看看preg_replace_callback
。
// This function will be called for every match of your
// regex and the return-value will be used as the replacement
$replaceCallback = function($matches) use ($dmodule) {
$menu = $matches[1];
$row = $dmodule->getModuleByModuleArea($menu);
$module = 'Simplified for readability';
return $module;
};
$text = preg_replace_callback($pattern, $replaceCallback, $text);