上一篇
免Smarty解析HTML,可使用
{literal}{/literal}标签包裹不需解析的内容,或修改Smarty定界符,也可将相关代码分离到外部文件引入
arty是一种PHP模板引擎,用于将PHP代码与HTML分离,但其使用的大括号{}作为变量和控制结构的标识符,可能与JavaScript或CSS中的相同符号产生混淆,以下是几种如何不让Smarty解析HTML的方法:
使用{literal}
方法
描述
示例
{literal}
告诉Smarty这部分内容不应该被解析为模板变量,将需要不被解析的内容放在{literal}和{/literal}标签之间
html <{literal}> $(function() { alert('培训课程'); }); {/literal}
修改Smarty的默认定界符
方法
描述
示例
修改定界符
通过设置Smarty的成员变量$left_delimiter和$right_delimiter的值,改变Smarty的定界符,使其与HTML中可能存在的冲突符号不同
php $tpl->left_delimiter = '<{'; $tpl->right_delimiter = '}>';
分离JavaScript和CSS代码到外部文件
方法
描述
示例
外部文件引入
将JavaScript和CSS代码分别放到单独的.js和.css文件中,然后在HTML模板中通过<script src="..."></script>和<link rel="stylesheet" href="..."/>引入,这样可以避免在HTML模板中直接书写这些代码时与Smarty定界符产生冲突
html <html> <head> <title>{$title}</title> <link rel="stylesheet" type="text/css" href="css/default.css"/> <script src="js/script.js"></script> </head> ... </html>
利用Smarty的$auto_literal属性
方法
描述
示例
$auto_literal属性
当Smarty模板中,和}定界符两边都是空格的时候,将会被自动忽略解析,此特性可以通过设置Smarty的成员变量$auto_literal为false来关闭
php $smarty->auto_literal = false;
使用其他标签包裹
方法
描述
示例
特定标签包裹
根据HTML5的标准,将HTML标签文本内容嵌入到<script type="text/html">或<script type="text/template">内部,并加上display: block,可使其不被浏览器解析为HTML标签,从而避免Smarty解析
html <script type="text/html" style="display: block;"> <div>This is a test</div> </script>
相关问答FAQs
问题1:修改Smarty定界符后,对已有的模板代码会有什么影响?
答:修改Smarty定界符后,所有使用旧定界符的模板代码都需要进行相应的修改,以适应新的定界符,否则,原本的变量输出、控制结构等模板代码将无法正确识别和执行,如果原来使用的是默认的定界符,修改后可能需要将所有的替换为新的定界符,如<{% %}>等,所以在修改定界符之前,需要对项目中的模板代码进行全面的评估和修改,以确保兼容性。
问题2:使用{literal}标签时,里面的内容真的完全不会被Smarty解析吗?
答:是的,{literal}标签内的内容会被Smarty完全视为纯文本,不会进行任何模板解析,这意味着其中的任何变量、函数调用等都不会被处理,而是原样输出,如果在{literal}标签内有{$var},它不会被解析为变量的值,而是直接输出{$var}这个字符串,但需要注意的是,如果{literal}标签没有正确闭合,可能会导致模板解析错误或者部分内容
| 方法 | 描述 | 示例 |
|---|---|---|
{literal} |
告诉Smarty这部分内容不应该被解析为模板变量,将需要不被解析的内容放在{literal}和{/literal}标签之间 |
html <{literal}> $(function() { alert('培训课程'); }); {/literal} |
修改Smarty的默认定界符
| 方法 | 描述 | 示例 |
|---|---|---|
| 修改定界符 | 通过设置Smarty的成员变量$left_delimiter和$right_delimiter的值,改变Smarty的定界符,使其与HTML中可能存在的冲突符号不同 | php $tpl->left_delimiter = '<{'; $tpl->right_delimiter = '}>'; |
分离JavaScript和CSS代码到外部文件
| 方法 | 描述 | 示例 |
|---|---|---|
| 外部文件引入 | 将JavaScript和CSS代码分别放到单独的.js和.css文件中,然后在HTML模板中通过<script src="..."></script>和<link rel="stylesheet" href="..."/>引入,这样可以避免在HTML模板中直接书写这些代码时与Smarty定界符产生冲突 |
html <html> <head> <title>{$title}</title> <link rel="stylesheet" type="text/css" href="css/default.css"/> <script src="js/script.js"></script> </head> ... </html> |
利用Smarty的$auto_literal属性
| 方法 | 描述 | 示例 |
|---|---|---|
| $auto_literal属性 | 当Smarty模板中,和}定界符两边都是空格的时候,将会被自动忽略解析,此特性可以通过设置Smarty的成员变量$auto_literal为false来关闭 | php $smarty->auto_literal = false; |
使用其他标签包裹
| 方法 | 描述 | 示例 |
|---|---|---|
| 特定标签包裹 | 根据HTML5的标准,将HTML标签文本内容嵌入到<script type="text/html">或<script type="text/template">内部,并加上display: block,可使其不被浏览器解析为HTML标签,从而避免Smarty解析 |
html <script type="text/html" style="display: block;"> <div>This is a test</div> </script> |
相关问答FAQs
问题1:修改Smarty定界符后,对已有的模板代码会有什么影响?
答:修改Smarty定界符后,所有使用旧定界符的模板代码都需要进行相应的修改,以适应新的定界符,否则,原本的变量输出、控制结构等模板代码将无法正确识别和执行,如果原来使用的是默认的定界符,修改后可能需要将所有的替换为新的定界符,如<{% %}>等,所以在修改定界符之前,需要对项目中的模板代码进行全面的评估和修改,以确保兼容性。
问题2:使用{literal}标签时,里面的内容真的完全不会被Smarty解析吗?
答:是的,{literal}标签内的内容会被Smarty完全视为纯文本,不会进行任何模板解析,这意味着其中的任何变量、函数调用等都不会被处理,而是原样输出,如果在{literal}标签内有{$var},它不会被解析为变量的值,而是直接输出{$var}这个字符串,但需要注意的是,如果{literal}标签没有正确闭合,可能会导致模板解析错误或者部分内容
