主题的复杂变量提取/ preg_match / replace / shortcodes

时间:2014-10-14 13:51:21

标签: php html regex shortcode

是的,我知道我正在重新发明轮子,但我不想使用框架或模板系统。

想法:

  • 创建一个theme.php,它保存页面布局的变量,即。 $layout['default']$layout['twocolumn']
  • 阅读theme.php $layouts
  • 根据一些变量提取布局,即。您正在查看的页面
  • $ li>中的
  • preg_match个简码,即。 {MODULEAREA=1}
  • 返回{MODULE = ie的数量。在$module
  • 中使用= 1
  • 用数据库中的内容替换短代码
  • 返回$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>
";

1 个答案:

答案 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);