Table des matières
{# $name #}
Maison développement back-end tutoriel php 代码解释类似smart模版引擎原理

代码解释类似smart模版引擎原理

Jul 29, 2016 am 09:05 AM
gt this

先贴下目录结构:

<code> ls
compiled/  index.php  source/  ss.class.PHP

compiled 模版编辑后的目录
index.php
source 模版源文件夹
ss.clsss.php 山寨类smarty文件夹
</code>
Copier après la connexion
<code>ss.clsss.php
</code>
Copier après la connexion
<code><?php class Template{

        private $templateDir;//源文件文件夹
        private $compileDir;//编译之后文件夹
        private $leftTag="{#";//需要替换的左边标记
        private $rightTag="#}";//需要替换的左边标记
        private $templateExtName=".html";
        private $currentTemp;//当前正在编译的模版文件名
        private $outputHtml;//正在读取的模版文件
        private $varPool=array();//模版变量池

        public function__construct($templateDir,$compileDir,$leftTag=null,$rightTag=null,$templateExtName=null){

            $this->templateDir=$templateDir;
            $this-&gt;compileDir=$compileDir;

            if(!empty($leftTag))$this-&gt;leftTag=$leftTag;
            if(!empty($rightTag))$this-&gt;rightTag=$rightTag;
            if(!empty($templateExtName))$this-&gt;templateExtName=$templateExtName;
        }

        // 把用到的变量放入到变量池子中
        public function assign($tag,$var){
            $this-&gt;varPool[$tag]=$var;
        }

        // 取出一条变量,用于下面的str_replace正则替换
        public function getVar($tag){
            return $this-&gt;varPool[$tag];
        }

        //获取模版源文件
        public function getSourceTemplate($templateName){

            $this-&gt;currentTemp=$templateName;

            // 拼接完整文件名
            $sourceFileName=$this-&gt;templateDir.$this-&gt;currentTemp.$this-&gt;templateExtName;
            $this-&gt;outputHtml=file_get_contents($sourceFileName);
        }

        // 编译
        public function compileTemplate($templateName=null){

            // 获取当前需要编译的模版
            $templateName=empty($templateName)?$this-&gt;currentTemp:$templateName;

            // $pattern='/\{#(\$[a-zA-Z_]\w+)#\}/';// 符合php变量命名

            //preg_quote 可对用户界定的左右定界符中出现. \ + * ? [ ^ ] $ ( ) { } = !  | : -进行转义
            $pattern="/".preg_quote($this-&gt;leftTag);

            //前后加上空格匹配任意次匹配类似<h1 id="name">{# $name  #}</h1>
            $pattern.=' *\$([a-zA-Z_]\w*) *';

            $pattern.=preg_quote($this-&gt;rightTag)."/";

            $this-&gt;outputHtml=preg_replace($pattern, '<?php echo $this->getVar(\'$1\');?&gt;', $this-&gt;outputHtml);// $1写成\\1也可以 

            // 注意不要用双引号,会解析getvar Template::$getVar报notice错误
            $this-&gt;outputHtml=preg_replace($pattern, "<?php echo $this->getVar(\\1);?&gt;", $this-&gt;outputHtml);

            $compileFileName=$this-&gt;compileDir.md5($templateName).$this-&gt;templateExtName;

            file_put_contents($compileFileName, $this-&gt;outputHtml);
        }

        // 输出
        public function display($templateName=null){

            $templateName=empty($templateName)?$this-&gt;currentTemp:$templateName;

            include($this-&gt;compileDir.md5($templateName).$this-&gt;templateExtName);

        }

    }</code>
Copier après la connexion

简单调用如下:(index.php中内容)

<code><?php include('ss.class.php');

    $basedir=str_replace('\\', '/', dirname(__FILE__));//兼容linux等区分大小写平台

    $test=new Template($basedir."/source/",$basedir."/compiled/");

    $test->assign('name','iamtb');

    $test-&gt;assign('pageTitle','tbtbt');

    $test-&gt;getSourceTemplate('index');

    $test-&gt;compileTemplate('index');

    $test-&gt;display('index');
</code>
Copier après la connexion

以上就介绍了代码解释类似smart模版引擎原理,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Quelles sont les différences entre Huawei GT3 Pro et GT4 ? Quelles sont les différences entre Huawei GT3 Pro et GT4 ? Dec 29, 2023 pm 02:27 PM

Quelles sont les différences entre Huawei GT3 Pro et GT4 ?

Correctif : l'outil de capture ne fonctionne pas sous Windows 11 Correctif : l'outil de capture ne fonctionne pas sous Windows 11 Aug 24, 2023 am 09:48 AM

Correctif : l'outil de capture ne fonctionne pas sous Windows 11

Comment réparer l'erreur Impossible de se connecter à l'App Store sur iPhone Comment réparer l'erreur Impossible de se connecter à l'App Store sur iPhone Jul 29, 2023 am 08:22 AM

Comment réparer l'erreur Impossible de se connecter à l'App Store sur iPhone

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决

Watch4pro est-il meilleur ou gt ? Watch4pro est-il meilleur ou gt ? Sep 26, 2023 pm 02:45 PM

Watch4pro est-il meilleur ou gt ?

Comment optimiser la durée de vie de la batterie de l'iPad avec iPadOS 17.4 Comment optimiser la durée de vie de la batterie de l'iPad avec iPadOS 17.4 Mar 21, 2024 pm 10:31 PM

Comment optimiser la durée de vie de la batterie de l'iPad avec iPadOS 17.4

Comment utiliser cette méthode en Java Comment utiliser cette méthode en Java Apr 18, 2023 pm 01:58 PM

Comment utiliser cette méthode en Java

Un article qui comprend ce point et rattrape 70% des front-end Un article qui comprend ce point et rattrape 70% des front-end Sep 06, 2022 pm 05:03 PM

Un article qui comprend ce point et rattrape 70% des front-end

See all articles