变量修饰器 Modifiers
修饰器用于对变量做格式化处理,用管道符 | 分隔、参数用冒号 : 传递(字符串参数需加引号)。DouView 内置恰好 20 个标准修饰器,注册于 filter/StandardFilters.php,运行期由 RenderContext::filter() 分发。
链式组合
{$content|truncate:100|nl2br|strip_tags}
{$title|escape:"html"|default:"默认标题"}
修饰器从左到右依次作用,前一个的输出是后一个的输入。下面逐一详解。
1. truncate — 截断字符串(UTF-8 安全)
{$var|truncate:长度:省略符:是否断词:是否中间截断}
签名 truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)。长度按 UTF-8 字符计;break_words=false 不在词中间断;middle=true 从中间截断(首尾各保留一半)。
{$content|truncate:100}
{$content|truncate:50:"...更多":false}
2. escape — 多类型转义
{$var|escape:转义类型:字符集}
签名 escape($string, $esc_type = 'html', $char_set = 'UTF-8')。支持的转义类型:
| 类型 | 行为 |
|---|---|
html |
htmlspecialchars(ENT_QUOTES) |
htmlall |
htmlentities(ENT_QUOTES) |
url |
rawurlencode |
urlpathinfo |
URL 编码但保留斜杠 |
quotes |
转义单引号 |
hex / hexentity / decentity |
十六进制 / 十六进制实体 / 十进制实体编码 |
javascript |
JS 字符串转义 |
mail |
邮箱保护(@ → [AT],. → [DOT]) |
nonstd |
ASCII ≥ 126 的字符转实体 |
{$user_input|escape:"html"}
{$url|escape:"url"}
若修饰器链中已含
|escape(或|escape:"html"),则该输出不再追加全局自动转义,避免双重转义。
3. nl2br — 换行符转 br
{$var|nl2br}
签名 nl2br($string),把换行符转为 HTML 换行标记。
4. strip_tags — 去除 HTML 标签
{$var|strip_tags:是否替换为空格}
签名 strip_tags($string, $replace_with_space = true)。true(默认)把标签替换为空格,false 直接删除。
{$html_content|strip_tags}
{$html_content|strip_tags:false}
5. capitalize — 首字母大写
{$var|capitalize:是否数字大写}
签名 capitalize($string, $uc_digits = false)。uc_digits=true 时数字开头的词也大写。
6. cat — 字符串连接
{$var|cat:"连接字符串"}
签名 cat($string, $cat = ''),在变量后拼接字符串。
{$name|cat:"先生"}
7. count_characters — 统计字符数
{$var|count_characters:是否包含空格}
签名 count_characters($string, $include_spaces = false)。true 含空格(按字节长度),false(默认)只统计非空白字符。
8. count_paragraphs — 统计段落数
{$var|count_paragraphs}
签名 count_paragraphs($string),按换行分割统计段数。
9. count_sentences — 统计句子数
{$var|count_sentences}
签名 count_sentences($string),按句末点号统计。
10. count_words — 统计单词数
{$var|count_words}
签名 count_words($string),按空白分割后统计含字母/数字的词数。
11. date_format — 日期格式化
{$日期变量|date_format:格式字符串:默认日期}
签名 date_format($string, $format = '%b %e, %Y', $default_date = '')。输入可为时间戳、YYYYMMDDHHMMSS 串或 strtotime 可解析字符串。使用 strftime 占位符,PHP 8.1+ 自动映射为 date() 等价格式(strftime 已废弃),输出与 PHP 5.6~8.0 一致。
常用占位符:
| 占位符 | 含义 | 占位符 | 含义 |
|---|---|---|---|
%Y |
四位年 | %y |
两位年 |
%m |
月(01-12) | %d |
日(01-31) |
%e |
日(不补零) | %H |
24 小时制 |
%I |
12 小时制 | %M |
分钟 |
%S |
秒 | %a / %A |
星期缩写 / 全称 |
%b / %B |
月份缩写 / 全称 | %p |
AM/PM |
%R |
H:i |
%T |
H:i:s |
{$timestamp|date_format:"%Y-%m-%d %H:%M:%S"}
{$create_time|date_format:"%Y年%m月%d日"}
12. default — 默认值
{$var|default:"默认值"}
签名 default($string, $default = '')。当变量未设置或为空字符串时回退默认值。
13. indent — 每行缩进
{$var|indent:缩进数:缩进字符}
签名 indent($string, $chars = 4, $char = ' '),在每行行首插入指定数量的字符。
14. string_format — sprintf 格式化
{$var|string_format:"格式"}
签名 string_format($string, $format),format 为必填。底层调 sprintf。
{$price|string_format:"%.2f"}
15. strip — 多空白压缩
{$var|strip:替换字符}
签名 strip($text, $replace = ' '),把连续空白压缩为单个字符(默认空格)。
16. lower — 转小写
{$var|lower}
17. upper — 转大写
{$var|upper}
18. replace — 字符串替换
{$var|replace:"查找字符串":"替换字符串"}
签名 replace($string, $search, $replace),search 与 replace 均为必填,底层调 str_replace。
{$content|replace:"旧文本":"新文本"}
19. spacify — 字符间插入分隔
{$var|spacify:分隔字符}
签名 spacify($string, $spacify_char = ' '),在每个字符之间插入分隔符。
{$word|spacify:"-"}
20. wordwrap — 自动换行
{$var|wordwrap:行长度:换行符:是否截断单词}
签名 wordwrap($string, $length = 80, $break = "\n", $cut = false)。cut=true 在词中间换行,默认 false 按词边界。
附:与全局转义的关系
- 修饰器链里已含
|escape(HTML 类)时,引擎不再补一次全局自动转义; - 输出追加
nofilter时强制不转义(详见「关闭转义 Nofilter」篇)。