ECJiaWiki:Smarty:变量修饰器

来自ECJiaWiki
跳转至: 导航搜索
ECJia到家Smarty模版手册导航
为什么选择Smarty?
基本语法-变量
基本语法-函数
基本语法-属性
基本语法-双引号中嵌入变量
基本语法-数学计算
从PHP赋值的变量
Smarty保留变量
变量修饰器
内置函数
自定义函数

目录

变量修饰器

  • 变量修饰器可以用于变量, 自定义函数或者字符串。 使用修饰器,需要在变量的后面加上|(竖线)并且跟着修饰器名称。 修饰器可能还会有附加的参数以便达到效果。 参数会跟着修饰器名称,用:(冒号)分开。 同时,默认全部PHP函数都可以作为修饰器来使用 (不止下面的),而且修饰器可以被 联合使用。

capitalize

  • 使变量内容里的每个单词的第一个字母大写。 与PHP函数的 ucwords()相似。
参数顺序 类型 必选参数 默认值 说明
1 boolean No FALSE 带数字的单词是否也头字母大写
2 boolean No FALSE 设置单词内其他字母是否小写,如"aAa" 变成 "Aaa"

PHP代码:

$this->cs->assign('articleTitle', 'next x-men film, x3, delayed.');

模板是:

{$articleTitle}
{$articleTitle|capitalize}
{$articleTitle|capitalize:true}

输出:

next x-men film, x3, delayed.
Next X-Men Film, x3, Delayed.
Next X-Men Film, X3, Delayed.

cat

  • 连接多个变量。
参数顺序 类型 必选参数 默认值 说明
1 string No 需要连接的变量


PHP代码:

$this->cs->assign('articleTitle', "Psychics predict world didn't end");

模板是:

{$articleTitle|cat:' yesterday.'}

输出:

Psychics predict world didn't end yesterday.

count_characters

  • 计算变量内容里有多少个字符。
参数顺序 类型 必选参数 默认值 说明
1 boolean No FALSE 计算总数时是否包括空格字符

PHP代码:

$this->cs->assign('articleTitle', 'Cold Wave Linked to Temperatures.');

模板:

{$articleTitle}
{$articleTitle|count_characters}
{$articleTitle|count_characters:true}

输出:

Cold Wave Linked to Temperatures.
29
33

count_paragraphs

  • 计算变量内容有多少个段落。

PHP代码:

$this->cs->assign('articleTitle',
                 "War Dims Hope for Peace. Child's Death Ruins Couple's Holiday.\n\n
                 Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation."
                );

模板是:

{$articleTitle}
{$articleTitle|count_paragraphs}

输出:

War Dims Hope for Peace. Child's Death Ruins Couple's Holiday.

Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation.
2

count_sentences

  • 计算变量内容有多少个句子。 每个句子必须以点号、问号或者感叹号结尾。(.?!)

PHP代码:

$this->cs->assign('articleTitle',
                 'Two Soviet Ships Collide - One Dies.
                 Enraged Cow Injures Farmer with Axe.'
                 );

模板是:

{$articleTitle}
{$articleTitle|count_sentences}

输出:

Two Soviet Ships Collide - One Dies. Enraged Cow Injures Farmer with Axe.
2

count_words

  • 用于计算变量内容有多少个单词。

PHP代码:

$this->cs->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');

模板是:

{$articleTitle}
{$articleTitle|count_words}

输出:

Dealers Will Hear Car Talk at Noon.
7

date_format

  • 将日期和时间格式化成strftime()的格式。 时间可以是unix的 时间戳, DateTime 对象, mysql时间戳,或者月日年格式的字符串,与PHP函数strtotime()类似。 模板设计者可以对date_format的格式有完全的控制。 如果传递到date_format的时间为空, 而第二个参数传递了值,那么第二个参数将作为需要格式化的时间。
参数顺序 类型 必选参数 默认值 说明
1 string No  %b %e, %Y 输出时间的格式定义
2 string No n/a 如果输入为空,则作为默认时间

PHP代码:

$this->cs->assign('articleTitle', 'Cold Wave Linked to Temperatures.');

Note

从Smarty-2.6.10开始,给date_format传递 数字值将一直被当作unix时间戳(除了mysql时间戳,看下文)。

在Smarty-2.6.10之前,数字值(如 YYYYMMDD)使用了php函数strtotime()来进行处理, 所以有时候值会被看作时间字符串而不是时间戳(取决于strtotime()的实现)。

唯一的例外mysql时间戳:14位数字值(YYYYMMDDHHMMSS), mysql时间戳比unix时间戳更优先匹配。

程序设计者说明

date_format是派生于PHP函数 strftime()的wrapper。 在PHP编译时strftime()的支持格式的数量将会受到系统影响。 请系统的说明找出完整的格式列表。 然而,部分格式是模拟了windows的行为,如 %D, %e, %h, %l, %n, %r, %R, %t, %T。 

PHP代码:

$config['date'] = '%I:%M %p';
$config['time'] = '%H:%M:%S';
$this->cs->assign('config', $config);
$this->cs->assign('yesterday', strtotime('-1 day'));
  • 模板使用了 $smarty.now取得当前的时间:
{$smarty.now|date_format}
{$smarty.now|date_format:"%D"}
{$smarty.now|date_format:$config.date}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:$config.time}

输出是:

Jan 1, 2022
01/01/22
02:33 pm
Dec 31, 2021
Monday, December 1, 2021
14:33:00
  • date_format支持格式:
  • %a - 当前区域星期几的简写
  • %A - 当前区域星期几的全称
  • %b - 当前区域月份的简写
  • %B - 当前区域月份的全称
  • %c - 当前区域首选的日期时间表达
  • %C - 世纪值(年份除以 100 后取整,范围从 00 到 99)
  • %d - 月份中的第几天,十进制数字(范围从 01 到 31)
  • %D - 和 %m/%d/%y 一样
  • %e - 月份中的第几天,十进制数字,一位的数字前会加上一个空格(范围从 ' 1' 到 '31')
  • %g - 和 %G 一样,但是没有世纪
  • %G - 4 位数的年份
  • %h - 和 %b 一样
  • %H - 24 小时制的十进制小时数(范围从 00 到 23)
  • %I - 12 小时制的十进制小时数(范围从 00 到 12)
  • %j - 年份中的第几天,十进制数(范围从 001 到 366)
  • %k - 小时,24 小时格式,没有前导零
  • %l - 小时,12 小时格式,没有前导零
  • %m - 十进制月份(范围从 01 到 12)
  • %M - 十进制分钟数
  • %n - 换行符
  • %p - 根据给定的时间值为 `am' 或 `pm',或者当前区域设置中的相应字符串
  • %r - 用 a.m. 和 p.m. 符号的时间
  • %R - 24 小时符号的时间
  • %S - 十进制秒数
  • %t - 制表符
  • %T - 当前时间,和 %H:%M:%S 一样
  • %u - 星期几的十进制数表达 [1,7],1 表示星期一
  • %U - 本年的第几周,从第一周的第一个星期天作为第一天开始
  • %V - 本年第几周的 ISO 8601:1988 格式,范围从 01 到 53,第 1 周是本年第一个至少还有 4 天的星期,星期一作为每周的第一天。(用 %G 或者 %g 作为指定时间戳相应周数的年份组成。)
  • %w - 星期中的第几天,星期天为 0
  • %W - 本年的第几周数,从第一周的第一个星期一作为第一天开始
  • %x - 当前区域首选的时间表示法,不包括时间
  • %X - 当前区域首选的时间表示法,不包括日期
  • %y - 没有世纪数的十进制年份(范围从 00 到 99)
  • %Y - 包括世纪数的十进制年份
  • %Z - 时区名或缩写
  • %% - 文字上的 `%' 字符

default

  • 为变量设置默认值。 当变量是unset或者empty的字符串时,默认值将显示。 必须要有一个参数。
参数顺序 类型 必选参数 默认值 说明
1 string No 控制 当变量为空时输出的值

PHP代码:

$this->cs->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');
$this->cs->assign('email', '');

模板是:

{$articleTitle|default:'no title'}
{$myTitle|default:'no title'}
{$email|default:'No email address available'}

输出:

Dealers Will Hear Car Talk at Noon.
no title
No email address available

escape

  • escape可用于将变量编码或转换成 html, url, 单引号, 十六进制, 十六进制实体, javascript 和 电邮地址。 默认是:html。
参数顺序 类型 必选参数 必选取值 默认值 说明
1 string No html, htmlall, url, urlpathinfo, 单引号, 十六进制, 十六进制实体, javascript, 电邮地址 html 带这是escape转换后的格式
2 string No ISO-8859-1, UTF-8, 和其他 htmlentities()支持的字符集 UTF-8 传递给htmlentities()的字符集类型
3 boolean No FALSE TRUE 两次转换实体,& 到 & (仅在 html 和 htmlall 使用)

PHP代码:

$this->cs->assign('articleTitle',
                "'Stiff Opposition Expected to Casketless Funeral Plan'"
                );
$this->cs->assign('EmailAddress','smarty@example.com');

下面是escape的例子和输出:

{$articleTitle}
'Stiff Opposition Expected to Casketless Funeral Plan'

{$articleTitle|escape}
'Stiff Opposition Expected to Casketless Funeral Plan'

{$articleTitle|escape:'html'}    {* escapes  & " ' < > *}
'Stiff Opposition Expected to Casketless Funeral Plan'

{$articleTitle|escape:'htmlall'} {* escapes ALL html entities *}
'Stiff Opposition Expected to Casketless Funeral Plan'

<a href="?title={$articleTitle|escape:'url'}">click here</a>
<a
href="?title=%27Stiff%20Opposition%20Expected%20to%20Casketless%20Funeral%20Plan%27">click here</a>

{$articleTitle|escape:'quotes'}
\'Stiff Opposition Expected to Casketless Funeral Plan\'

<a href="mailto:{$EmailAddress|escape:"hex"}">{$EmailAddress|escape:"hexentity"}</a>
{$EmailAddress|escape:'mail'}    {* this converts to email to text *}
<a href="mailto:%62%6f%..snip..%65%74">bo&#x62..snip..et</a>

{'mail@example.com'|escape:'mail'}
smarty [AT] example [DOT] com

另一个例子:

{*  "rewind"参数是当前URL地址 *}
<a href="{$my_path}?page=foo&rewind={$my_uri|urlencode}">click here</a>

   
这个方法很适合用在电邮地址上,另外可以参见 {mailto}


{* 电邮地址编码 *}
<a href="mailto:{$EmailAddress|escape:'hex'}">{$EmailAddress|escape:'mail'}</a>

from_charset

  • from_charset转换变量到内置字符集。 与 to_charset 修饰器 刚好相反。
参数顺序 类型 必选参数 必选取值 默认值 说明
1 string No ISO-8859-1, UTF-8或者任何 mb_convert_encoding()函数支持的字符集名称。 ISO-8859-1 需要转换的字符集名称

PHP代码:

$this->cs->assign('articleTitle',
                "'Stiff Opposition Expected to Casketless Funeral Plan'"
                );
$this->cs->assign('EmailAddress','smarty@example.com');

下面是escape的例子和输出:

{$articleTitle}
'Stiff Opposition Expected to Casketless Funeral Plan'

{$articleTitle|escape}
'Stiff Opposition Expected to Casketless Funeral Plan'

{$articleTitle|escape:'html'}    {* escapes  & " ' < > *}
'Stiff Opposition Expected to Casketless Funeral Plan'

{$articleTitle|escape:'htmlall'} {* escapes ALL html entities *}
'Stiff Opposition Expected to Casketless Funeral Plan'

<a href="?title={$articleTitle|escape:'url'}">click here</a>
<a
href="?title=%27Stiff%20Opposition%20Expected%20to%20Casketless%20Funeral%20Plan%27">click here</a>

{$articleTitle|escape:'quotes'}
\'Stiff Opposition Expected to Casketless Funeral Plan\'

<a href="mailto:{$EmailAddress|escape:"hex"}">{$EmailAddress|escape:"hexentity"}</a>
{$EmailAddress|escape:'mail'}    {* this converts to email to text *}
<a href="mailto:%62%6f%..snip..%65%74">bo&#x62..snip..et</a>

{'mail@example.com'|escape:'mail'}
smarty [AT] example [DOT] com

indent

  • 缩进每一行的字符串,默认是缩进4个空格。 可选的参数可以设置缩进的空格数量。 可选的第二个参数设置缩进使用的字符,如用 "\t" 来代替空格缩进。
参数顺序 类型 必选参数 默认值 说明
1 integer No 4 设置缩进多少空格
2 string No 一个空格 设置用什么字符来进行缩进


PHP代码:

$this->cs->assign('articleTitle',
                'NJ judge to rule on nude beach.
Sun or rain expected today, dark tonight.
Statistics show that teen pregnancy drops off significantly after 25.'
                );

模板是:

{$articleTitle}

{$articleTitle|indent}

{$articleTitle|indent:10}

{$articleTitle|indent:1:"\t"}

输出:

NJ judge to rule on nude beach.
Sun or rain expected today, dark tonight.
Statistics show that teen pregnancy drops off significantly after 25.

    NJ judge to rule on nude beach.
    Sun or rain expected today, dark tonight.
    Statistics show that teen pregnancy drops off significantly after 25.

          NJ judge to rule on nude beach.
          Sun or rain expected today, dark tonight.
          Statistics show that teen pregnancy drops off significantly after 25.

        NJ judge to rule on nude beach.
        Sun or rain expected today, dark tonight.
        Statistics show that teen pregnancy drops off significantly after 25.
</pre。
 
==lower==

*将变量值转成小写字母。 等同于PHP的 strtolower()函数。 

===PHP代码===

*$this->cs->assign('articleTitle', 'Two Convicts Evade Noose, Jury Hung.');
===模板是:===
<pre>
{$articleTitle}
{$articleTitle|lower}

输出:

Two Convicts Evade Noose, Jury Hung.
two convicts evade noose, jury hung.

nl2br

  • 将变量值中的"\n"回车全部转换成HTML的
    。 等同于PHP的 nl2br()函数。

PHP代码:

$this->cs->assign('articleTitle',
                "Sun or rain expected\ntoday, dark tonight"
                );

模板是:

{$articleTitle|nl2br}

输出:

Sun or rain expected<br />today, dark tonight

regex_replace

  • 用正则表达式搜索和替换变量值。 使用PHP的 preg_replace()函数进行。

Note

  • 虽然Smarty提供了较方便的正则表达式修饰器, 但通常更好的方式是通过自定义函数或自定义修饰器在PHP端进行正则匹配替换。 正则表达式是程序应用代码,不是显示的逻辑代码。

参数

参数顺序 类型 必选参数 默认值 说明
1 string yes n/a 设置缩进多少空格
2 string No 一个空格 设置用什么字符来进行缩进

PHP代码:

$this->cs->assign('articleTitle', "Infertility unlikely to\nbe passed on, experts say.");
===模板是:===
{* replace each carriage return, tab and new line with a space *}

{$articleTitle}
{$articleTitle|regex_replace:"/[\r\t\n]/":" "}

输出:

Infertility unlikely to
be passed on, experts say.
Infertility unlikely to be passed on, experts say.

replace

  • 对变量进行简单的搜索和替换。 等同于PHP函数的 str_replace()。
参数顺序 类型 必选参数 默认值 说明
1 string yes n/a 需要搜索并替换的字符
2 string yes n/a 替换的字符


PHP代码:

$this->cs->assign('articleTitle', "Child's Stool Great for Use in Garden.");

模板是

{$articleTitle}
{$articleTitle|replace:'Garden':'Vineyard'}
{$articleTitle|replace:' ':'   '}

输出:

Child's Stool Great for Use in Garden.
Child's Stool Great for Use in Vineyard.
Child's   Stool   Great   for   Use   in   Garden.

spacify

  • spacify会在变量的字符串中插入空格。 你可以设置插入的是空格或者别的字符。
参数顺序 类型 必选参数 默认值 说明
1 string No n/a 需要搜索并替换的字符

PHP代码:

$this->cs->assign('articleTitle', 'Something Went Wrong in Jet Crash, Experts Say.');

模板是:

{$articleTitle}
{$articleTitle|spacify}
{$articleTitle|spacify:"^^"}

输出:

Something Went Wrong in Jet Crash, Experts Say.
S o m e t h i n g   W .... snip ....  s h ,   E x p e r t s   S a y .
S^^o^^m^^e^^t^^h^^i^^n^^g^^ .... snip .... ^^e^^r^^t^^s^^ ^^S^^a^^y^^.

string_format

  • 格式化字符串,如浮点数等。 使用 sprintf()的PHP函数来进行。
参数顺序 类型 必选参数 默认值 说明
1 string Yes n/a 指定哪种格式 (sprintf)


PHP代码:

$this->cs->assign('number', 23.5787446);

模板是:

{$number}
{$number|string_format:"%.2f"}
{$number|string_format:"%d"}

输出:

23.5787446
23.58
24

strip

  • 转换连续空格,回车和tab到单个空格或是指定字符串。

Note

  • 如果你希望转换模板文字内的空格,使用内置的 {strip} 函数。

PHP代码:

$this->cs->assign('articleTitle', "Grandmother of\neight makes\t    hole in one.");

模板是:

{$articleTitle}
{$articleTitle|strip}
{$articleTitle|strip:' '}

输出:

Grandmother of
eight makes        hole in one.
Grandmother of eight makes hole in one.
Grandmother of eight makes hole in one.

strip_tags

  • 去除标记等任何包含在< 和 >中间的字符。.
参数顺序 类型 必选参数 默认值 说明
1 bool No TRUE 设置是否将标签替换成' ' 或者 (sprintf) (sprintf)

PHP代码:

$this->cs->assign('articleTitle',
                "Blind Woman Gets <font face=\"helvetica\">New
Kidney</font> from Dad she Hasn't Seen in <b>years</b>."
               );

模板是:

{$articleTitle}
{$articleTitle|strip_tags} {* same as {$articleTitle|strip_tags:true} *}
{$articleTitle|strip_tags:false}

输出:

Blind Woman Gets <font face="helvetica">New Kidney</font> from Dad she Hasn't Seen in <b>years</b>.
Blind Woman Gets  New Kidney  from Dad she Hasn't Seen in  years .
Blind Woman Gets New Kidney from Dad she Hasn't Seen in years.

to_charset

  • to_charset可将变量值由当前内置字符集转换到指定字符集。 它是 from_charset 修饰器 的相反操作。
参数顺序 类型 必选参数 允许取值 默认值 说明
1 string No ISO-8859-1 UTF-8或者任何 mb_convert_encoding()函数允许的字符集名ISO-8859-1 转换到的字符集类型 (sprintf)


字符集转换应该由应用程序本身进行。 该修饰器只在应用程序不确定变量是否需要转字符集的时候使用。

truncate

  • 截取字符串到指定长度,默认长度是80. 第二个参数可选,指定了截取后代替显示的字符。 截取后的字符长度是截取规定的长度加上第二个参数的字符长度。 默认truncate会尝试按单词进行截取。如果你希望按字符截取(单词可能会被截断),需要设置第三个参数TRUE。
参数顺序 类型 必选参数 默认值 说明
2 integer No 80 截取的长度
1 string No ... 截取后替代显示的字符,该字符长度会被计算到截取长度内。
1 boolean No FALSE 是否按单词截取FALSE,或是按字符截取TRUE
1 boolean No FALSE 当字符截取的长度刚好等于字符本身长度时,是否截取。 FALSE也会截取。 TRUE是不会截取。 注意如果设置为TRUE,单词的边界会被忽略。

PHP代码:

$this->cs->assign('articleTitle', 'Two Sisters Reunite after Eighteen Years at Checkout Counter.');

模板是:

{$articleTitle}
{$articleTitle|truncate}
{$articleTitle|truncate:30}
{$articleTitle|truncate:30:""}
{$articleTitle|truncate:30:"---"}
{$articleTitle|truncate:30:"":true}
{$articleTitle|truncate:30:"...":true}
{$articleTitle|truncate:30:'..':true:true}

=输出:

Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after...
Two Sisters Reunite after
Two Sisters Reunite after---
Two Sisters Reunite after Eigh
Two Sisters Reunite after E...
Two Sisters Re..ckout Counter.


unescape

  • unescape可以解码entity, html 和 htmlall等的编码。 它与 escape 修饰器 的效果刚好相反。
参数顺序 类型 必选参数 允许取值</ht> 默认值 说明
1 string No html,htmlall entity,html 解码的类型
2 string No ISO-8859-1, UTF-8, 或者任何 htmlentities()可以支持的字符集。 传递给html_entity_decode() 、 htmlspecialchars_decode() 或 mb_convert_encoding()的字符集 解码的类型

PHP代码:[编辑]

解码的类型


PHP代码:

$this->cs->assign('articleTitle',
                "Germans use "Ümlauts" and pay in €uro"
                );

unescape例子:

{$articleTitle}
Germans use "Ümlauts" and pay in €uro

{$articleTitle|unescape:"html"}
Germans use "Ümlauts" and pay in €uro

{$articleTitle|unescape:"htmlall"}
Germans use ""Umlauts" and pay in EURuro

upper

  • 将变量值转成大写字母。 等同于PHP的 strtoupper() 函数。

PHP代码:

$this->cs->assign('articleTitle', "If Strike isn't Settled Quickly it may Last a While.");

模板是:

{$articleTitle}
{$articleTitle|upper}
===输出:===
If Strike isn't Settled Quickly it may Last a While.
IF STRIKE ISN'T SETTLED QUICKLY IT MAY LAST A WHILE.

wordwrap

  • 限制一行字符的长度(自动换行),默认是80个字符长度。 可选的第二个参数,可自定义换行字符,默认换行字符是 "\n"。 默认情况下,是根据单词来换行的,也就是按英文语法的自动换行。 如果你希望按照字符来换行(边界的单词将拆开),那么可以设置 可选的第三个参数为TRUE,效果与PHP函数wordwrap()一样。
参数顺序 类型 必选参数 默认值 说明
1 integer No 80 限定一行的长度
2 string No \n 换行符号
3 boolean No FALSE 是否按单词截取FALSE,或是按字符截取TRUE
1 boolean/td> No FALSE 设置按单词换行(FALSE),或者按字符换行(TRUE)

PHP代码:

$this->cs->assign('articleTitle',
                "Blind woman gets new kidney from dad she hasn't seen in years."
               );

模板是:

{$articleTitle}

{$articleTitle|wordwrap:30}

{$articleTitle|wordwrap:20}

{$articleTitle|wordwrap:30:"<br />\n"}

{$articleTitle|wordwrap:26:"\n":true}

输出:

Blind woman gets new kidney from dad she hasn't seen in years.

Blind woman gets new kidney
from dad she hasn't seen in
years.

Blind woman gets new
kidney from dad she
hasn't seen in
years.

Blind woman gets new kidney<br />
from dad she hasn't seen in<br />
years.

Blind woman gets new kidn
ey from dad she hasn't se
en in years.

复合修饰器

  • 你可以联合使用多个修饰器。 它们会按复合的顺序来作用于变量,从左到右。 它们必须以| (竖线)进行分隔。

PHP代码:

$this->cs->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');

模板是:

{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}

输出:

Smokers are Productive, but Death Cuts Efficiency.
S M O K E R S   A R ....snip....  H   C U T S   E F F I C I E N C Y .
s m o k e r s   a r ....snip....  b u t   d e a t h   c u t s...
s m o k e r s   a r e   p r o d u c t i v e ,   b u t . . .
s m o k e r s   a r e   p. .