模板引擎?No 正则而已
之前就觉得TP的那个模板引擎太不爽了,非常的蛋疼,所以参照PHPCMS的改了下,哈哈,自己看吧 无 /** * 模板函数 * @param string $template 模板文件名 * @param string $path 模板路径 * @param string $suffix 模板后缀 */function template($template = '', $p
之前就觉得TP 的那个模板引擎太不爽了,非常的蛋疼,所以参照PHPCMS的 改了下, 哈哈,自己看吧
/** * 模板函数 * @param string $template 模板文件名 * @param string $path 模板路径 * @param string $suffix 模板后缀 */ function template($template = '', $path = '', $suffix = '', $show_error = true) { $tpl_path = $path ? $path : (config('tpl_path') ? config('tpl_path') : './template/'); $tpl_suffix = $suffix ? $suffix : (config('tpl_suffix') ? config('tpl_suffix') : '.html'); if (empty($template)) { $template_file = $tpl_path . __MODULE__ . '/' . __CONTROLLER__ . '/' . __ACTION__; } else { if (!$path) { $pcount = substr_count($template, '/'); if ($pcount == 0) { $template_file = $tpl_path . __MODULE__ . '/' . __CONTROLLER__ . '/' . trim($template, '/'); } else if ($pcount == 1) { $template_file = $tpl_path . __MODULE__ . '/' . trim($template, '/'); } else { $template_file = $tpl_path . trim($template, '/'); } } else { $template_file = $path . trim($template, '/'); } } $template_file .= $tpl_suffix; if (!is_file($template_file)) { if ($show_error === true) { halt('模板文件不存在:' . $template_file); } } else { $cache_template = DATA_PATH . 'cache' . _DIR . 'template' . _DIR . __MODULE__ . _DIR . md5($template_file) . '.php'; if (is_file($cache_template) && config('tpl_cache') == true && (config('tpl_expire') == 0 || (@filemtime($cache_template) + config('tpl_expire')) < time())) { } else { template::template_compile($template_file, $cache_template); } return $cache_template; } }
<?php class template { /** * 编译模板 * @param string $template_file 模板文件 * @param string $cache_file 缓存文件 */ public static function template_compile($template_file, $cache_file) { if (!is_file($template_file)) { return false; } $content = file_get_contents($template_file); $cache_dir = dirname($cache_file); if (!is_dir($cache_dir)) { mkdir($cache_dir, 0777, true); } $content = self::parse_template($content); @file_put_contents($cache_file, $content); return $cache_file; } public static function parse_template($str) { //include $str = preg_replace("/\{template\s+(.+)\}/", "<?php include template(\\1,'','','',false); ?>", $str); $str = preg_replace("/\{include\s+(.+)\}/", "<?php include \\1; ?>", $str); $str = preg_replace("/\{php\s+(.+?)\}/", "<?php \\1?>", $str); $str = preg_replace("/\{!(.+?)\}/", "<?php \\1?>", $str); $str = preg_replace("/\{if\s+(.+?)\}/", "<?php if(\\1) { ?>", $str); $str = preg_replace("/\{else\}/", "<?php } else { ?>", $str); $str = preg_replace("/\{elseif\s+(.+?)\}/", "<?php } elseif (\\1) { ?>", $str); $str = preg_replace("/\{\/if\}/", "<?php } ?>", $str); //for $str = preg_replace("/\{for\s+(.+?)\}/", "<?php for(\\1) { ?>", $str); $str = preg_replace("/\{\/for\}/", "<?php } ?>", $str); //++ -- $str = preg_replace("/\{\+\+(.+?)\}/", "<?php ++\\1; ?>", $str); $str = preg_replace("/\{\-\-(.+?)\}/", "<?php ++\\1; ?>", $str); $str = preg_replace("/\{(.+?)\+\+\}/", "<?php \\1++; ?>", $str); $str = preg_replace("/\{(.+?)\-\-\}/", "<?php \\1--; ?>", $str); //loop $str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/", "<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>", $str); $str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", "<?php \$n=1; if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>", $str); $str = preg_replace("/\{\/loop\}/", "<?php \$n++;}unset(\$n); ?>", $str); //函数 $str = preg_replace("/\{:([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str); $str = preg_replace("/\{~([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php \\1;?>", $str); //变量 $str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str); $str = preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "<?php echo \\1;?>", $str); $str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\->[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:])\}/", "<?php echo \\1;?>", $str); $str = preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|([^{}]*)\}/", "<?php if(!empty(\\1)){echo \\1;}else{echo \\2;}?>", $str); $str = preg_replace('/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\->)[^\}]+)\}/',"<?php echo \\1;?>", $str); //数组 $str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "self::addquote('<?php echo \\1;?>')", $str); $str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\|([^{}]*)\}/es", "self::addquote('<?php if(!empty(\\1)){echo \\1;}else{echo \\2;} ?>')", $str); //常量 $str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>", $str); //扩展标签 $str = preg_replace("/\{tag:(\w+)\s+([^}]+)\}/ie", "self::tag('$1','$2')", $str); $str = preg_replace("/\{:tag:(\w+)\s+([^}]+)\}/ie", "self::tag('$1','$2',true)", $str); return $str; } public static function addquote($var) { return str_replace("\\\"", "\"", preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var)); } public static function tag($name, $data, $echo = false) { preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i", stripslashes($data), $matches, PREG_SET_ORDER); foreach ($matches as $v) { if (in_array($v[1], array('action', 'cache', 'return'))) { $$v[1] = $v[2]; continue; } $datas[$v[1]] = $v[2]; } if (!isset($action) || empty($action)) { //方法 return false; } if (isset($cache)) { //缓存 $cache = intval($cache); } else { $cache = false; } if (!isset($return) || empty($return)) { $return = '$data'; } $tag_file = EXT_PATH . 'tags' . _DIR . $name . '_tag' . EXT; if (!is_file($tag_file)) { return false; } $str = '<?php '; if ($cache !== false) { $cache_name = 'tag/'.$name.'_'.$action. to_guid_string($datas); $str .= '$cache = cache::getInstance();'; $str .= $return . '=$cache->get("' . $cache_name . '");'; $str .= 'if(' . $return . ' === false){'; $str .= '$params = ' . self::filter_var($datas) . ';'; $str .= '$tag = load_ext("tags/' . $name . '_tag",true);'; $str .= $return . '=$tag->' . $action . '($params);'; $str .= '$cache->set("' . $cache_name . '",' . $return . ',' . $cache . ');'; $str .= '}'; if ($echo == true) { $str .= 'echo ' . $return . ';'; } $str .= ' ?>'; } else { $str .= '$params = ' . self::filter_var($datas) . ';'; $str .= '$tag = load_ext("tags/' . $name . '_tag",true);'; if ($echo) { $str .= 'echo $tag->' . $action . '($params);'; } else { $str .= $return . '=$tag->' . $action . '($params);'; } $str .= ' ?>'; } return $str; } protected static function filter_var($data) { $str = var_export($data, true); //$str = preg_replace('/\'\$(\w+?)\'/', "\$\\1", $str); $str = preg_replace('/\'/', '"', $str); $str = preg_replace('/\s{2,}/', '', $str); return $str; } }
public function test(){ include template(); }
{if !empty($result)} {loop $result $r} <tr> <td>{$r['order_sn']}</td> <td>{$r['name']}</td> <td>{$r['mobile']}</td> <td>{:fdate($r['add_time'])}</td> <td>{if $r['status'] == 0}处理中{elseif $r['status'] ==1}已处理{else}无效{/if}</td> </tr> {/loop} {else} <tr> <td colspan="9"> <span style="padding:10px; display:block;">您还没有收到任何预约</span> </td> </tr> {/if}

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Les expressions régulières PHP sont un outil puissant pour le traitement et la conversion de texte. Il peut gérer efficacement les informations textuelles en analysant le contenu du texte et en le remplaçant ou en l'interceptant selon des modèles spécifiques. Parmi elles, une application courante des expressions régulières consiste à remplacer des chaînes commençant par des caractères spécifiques. Nous expliquerons cela comme suit.

Concernant le masquage PPT, beaucoup de gens ne doivent pas le connaître. La plupart des gens ne le comprennent pas complètement lorsqu'ils créent un PPT, mais l'inventent simplement pour créer ce qu'ils aiment. Par conséquent, beaucoup de gens ne savent pas ce que signifie le masquage PPT et ne le comprennent pas non plus. Je sais ce que fait ce masque, et je ne sais même pas s'il peut rendre l'image moins monotone. Amis qui veulent apprendre, venez apprendre et ajoutez des masques PPT à vos images PPT. Alors, comment ajouter un masque PPT ? S'il vous plaît lire ci-dessous. 1. Nous ouvrons d'abord PPT, sélectionnons une image vierge, puis cliquons avec le bouton droit sur [Définir le format d'arrière-plan] et sélectionnons une couleur unie. 2. Cliquez sur [Insérer], Word Art, entrez le mot 3. Cliquez sur [Insérer], cliquez sur [Forme]

Les expressions régulières Golang utilisent le caractère barre verticale | pour faire correspondre plusieurs mots ou chaînes, séparant chaque option comme une expression OU logique. Par exemple : correspond à "fox" ou "dog" : fox|dog correspond à "quick", "brown" ou "lazy" : (quick|brown|lazy) correspond à "Go", "Python" ou "Java" : Go| Python |Java fait correspondre des mots ou des codes postaux à 4 chiffres : ([a-zA

Comment supprimer le chinois en utilisant les règles habituelles en PHP : 1. Créez un exemple de fichier PHP ; 2. Définissez une chaîne contenant le chinois et l'anglais ; 3. Utilisez "preg_replace('/([\x80-\xff]*)/i', '',$a);" La méthode standard peut supprimer les caractères chinois des résultats de la requête.

Les spécialisations de modèles C++ affectent la surcharge et la réécriture des fonctions : Surcharge de fonctions : les versions spécialisées peuvent fournir différentes implémentations d'un type spécifique, affectant ainsi les fonctions que le compilateur choisit d'appeler. Remplacement de fonction : la version spécialisée dans la classe dérivée remplacera la fonction modèle dans la classe de base, affectant le comportement de l'objet de classe dérivée lors de l'appel de la fonction.

Modèles de courrier électronique PHP : personnalisez le contenu de votre courrier électronique Avec la popularité et l'utilisation généralisée du courrier électronique, les modèles de courrier électronique traditionnels ne peuvent plus répondre aux besoins des utilisateurs en matière de contenu de courrier électronique personnalisé et personnalisé. Nous pouvons désormais créer des modèles d'e-mails personnalisés en utilisant le langage de programmation PHP. Cet article vous montrera comment utiliser PHP pour atteindre cet objectif et fournira quelques exemples de code spécifiques. 1. Créer un modèle d'e-mail Tout d'abord, nous devons créer un modèle d'e-mail de base. Ce modèle peut être un HTM

Selon les informations du 8 octobre, le marché automobile américain subit un changement sous le capot. Les moteurs à six et huit cylindres, autrefois appréciés, perdent progressivement leur domination, tandis que les moteurs à trois cylindres font leur apparition. Les informations du 8 octobre ont montré que le marché automobile américain subit actuellement un changement sous le capot. Les moteurs à six et huit cylindres bien-aimés du passé perdent progressivement leur domination et le moteur à trois cylindres commence à émerger. Dans l'esprit de la plupart des gens, les Américains aiment les modèles de grande cylindrée et le « gros V8 américain ». a toujours été synonyme de voitures américaines. Cependant, selon des données récemment publiées par des médias étrangers, le paysage du marché automobile américain subit d’énormes changements et la bataille sous le capot s’intensifie. Il est entendu qu'avant 2019, les États-Unis

C++ est un langage de programmation largement utilisé dans divers domaines. Sa métaprogrammation de modèles est une technologie de programmation avancée qui permet aux programmeurs de transformer des types et des valeurs au moment de la compilation. La métaprogrammation de modèles est un sujet largement discuté en C++, les questions qui y sont liées sont donc assez courantes dans les entretiens. Voici quelques modèles courants de questions d'entretien de métaprogrammation en C++ qui pourraient vous être posées. Qu’est-ce que la métaprogrammation de modèles ? La métaprogrammation de modèles est une technique permettant de manipuler des types et des valeurs au moment de la compilation. Il utilise des modèles et des métafonctions pour générer en fonction des types et des valeurs
