function parse($path, array $var = array(), $maxDepth = null) { $file = $this->basePath . '/' . ltrim($path, '/'); $meta = array(); foreach (array(dirname(dirname($file)), dirname($file)) as $v) { $v .= '/_meta.txt'; if (file_exists($v)) { $meta = array_merge_recursive($meta, $this->parseArr($this->getContent($v), $maxDepth)); } } $content = $this->getContent($file); // parse here doc $hereDoc = array(); $content = preg_replace_callback('/<<<(.+)>>>/sm', function (&$node) use(&$hereDoc) { $hereDoc[] = $node[1]; return '\\d' . (count($hereDoc) - 1); }, $content); $arr = $this->parseArr($content, $maxDepth); if (array_key_exists('_meta', $arr)) { if (!empty($arr['_meta'])) { $meta = array_merge_recursive($meta, $arr['_meta']); } unset($arr['_meta']); } if (!empty($meta['_unset'])) { Helper_Array::unsetr($meta, $meta['_unset']); unset($meta['_unset']); } foreach ($arr as $k => $v) { if (null == $v) { unset($arr[$k]); continue; } $parent = $meta; // unset if (!empty($v['_unset'])) { Helper_Array::unsetr($parent, $v['_unset']); unset($v['_unset']); } // default if (!empty($parent['default'])) { list($v, $temp) = array($parent['default'], $v); Helper_Array::merger($v, $temp); } // replace Helper_Array::pregReplacer('/^\\\\k$/', $k, $v); // key clean Helper_Array::pregKeyReplacer('/^\\\\s(\\d+)$/', '\\1', $v); // prefix if (!empty($parent['prefix'])) { Helper_Array::prefixr($v, $parent['prefix']); } // suffix if (!empty($parent['suffix'])) { Helper_Array::suffixr($v, $parent['suffix']); } // wraper if (!empty($parent['wraper'])) { Helper_Array::wraperr($v, $parent['wraper']); } // var replace if (!empty($var)) { array_walk_recursive($v, function (&$v, $k, $var) { if (is_string($v)) { preg_match_all('/\\{\\$(\\w+)\\}/', $v, $matches); if (!empty($matches[1])) { foreach ($matches[1] as $v1) { if (isset($var[$v1])) { $v = str_replace('{$' . $v1 . '}', $var[$v1], $v); } } } } }, $var); } // \d 恢复 $search = $replace = array(); for ($i = 0; $i < count($hereDoc); $i++) { $search[] = '/^\\\\d' . $i . '$/'; $replace[] = $hereDoc[$i]; } Helper_Array::pregReplacer($search, $replace, $v); $arr[$k] = $v; } // \h自继承 $funcH = function (array &$subject) use(&$funcH, $arr) { foreach ($subject as $k => &$v) { if ('\\h' === $k) { $key = explode(' ', $v); $value = Helper_Array::current($arr, $key); $key = array_pop($key); $subject[$key] = $value; unset($subject[$k]); } elseif (is_array($v)) { call_user_func_array($funcH, array(&$v)); } } }; $funcH($arr); // \i 包含 $dir = dirname($file) . '/_inc'; Helper_Array::pregReplaceCallbackr('/\\\\i(.+)/', function ($node) use($dir) { $file = $dir . '/' . trim($node[1]); if (file_exists($file)) { return file_get_contents($file); } }, $arr); return $arr; }