热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tp5模板中引入文件include方法引入的文件中使用了自定义标签导致无法解析问题

tp5框架下:thinkphp\library\think\Template.php原方法:***解析模板中的include标签*accesspriv

tp5框架下:thinkphp\library\think\Template.php
原方法:

/*** 解析模板中的include标签* @access private* @param string $content 要解析的模板内容* @return void*/private function parseInclude(&$content){$regex = $this->getRegex('include');$func = function ($template) use (&$func, &$regex, &$content) {if (preg_match_all($regex, $template, $matches, PREG_SET_ORDER)) {foreach ($matches as $match) {$array = $this->parseAttr($match[0]);$file = $array['file'];unset($array['file']);// 分析模板文件名并读取内容$parseStr = $this->parseTemplateName($file);foreach ($array as $k => $v) {// 以$开头字符串转换成模板变量if (0 === strpos($v, '$')) {$v = $this->get(substr($v, 1));}$parseStr = str_replace('[' . $k . ']', $v, $parseStr);}$content = str_replace($match[0], $parseStr, $content);// 再次对包含文件进行模板分析$func($parseStr);}unset($matches);}};// 替换模板中的include标签$func($content);return;}

更新后:

/*** 解析模板中的include标签* @access private* @param string $content 要解析的模板内容* @return void*/private function parseInclude(&$content){$regex = $this->getRegex('include');$func = function ($template) use (&$func, &$regex, &$content) {if (preg_match_all($regex, $template, $matches, PREG_SET_ORDER)) {foreach ($matches as $match) {$array = $this->parseAttr($match[0]);$file = $array['file'];unset($array['file']);//解析变量if (0 === strpos($file, '$')) {if(strpos($file,'/')!==false){$val= $this->get(substr($file, 1,strpos($file,'/')-1));$file =$val.substr($file, strpos($file,'/'));}else{$file = $this->get(substr($file, 1));}}// 分析模板文件名并读取内容$parseStr = $this->parseTemplateName($file);foreach ($array as $k => $v) {// 以$开头字符串转换成模板变量if (0 === strpos($v, '$')) {$v = $this->get(substr($v, 1));}$parseStr = str_replace('[' . $k . ']', $v, $parseStr);}$content = str_replace($match[0], $parseStr, $content);// 再次对包含文件进行模板分析$func($parseStr);}unset($matches);}};// 替换模板中的include标签$func($content);return;}

主要增加了一段解析变量的代码

//解析变量
if (0 === strpos($file, '$')) {if(strpos($file,'/')!==false){$val= $this->get(substr($file, 1,strpos($file,'/')-1));$file =$val.substr($file, strpos($file,'/'));}else{$file = $this->get(substr($file, 1));}
}

如果引用的文件中使用了自定义标签
更新前在html中这样写会解析不了变量$PATH(控制器中定义的)
{include file="$PATH/tel/head.html" /}
更新后可以正常解析


推荐阅读
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 如何解决TS1219:实验性装饰器功能可能在未来版本中更改的问题
    本文介绍了两种方法来解决TS1219错误:通过VSCode设置启用实验性装饰器,或在项目根目录下创建配置文件(jsconfig.json或tsconfig.json)。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 在Linux系统中,为了提高安全性,可以通过设置命令执行超时和用户超时注销来防止因用户长时间未操作而带来的安全隐患。具体而言,可以通过编辑 `/etc/profile` 文件,添加或修改相关参数,确保用户在指定时间内无操作后自动注销。此外,还可以利用 `timeout` 命令来限制特定命令的执行时间,进一步增强系统的稳定性和安全性。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
author-avatar
有有1988_540
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有