语法文档

Scriban 模板语法参考

轻量级、快速且安全的模板引擎,用于 .NET 应用

版本 5.0+ · 更新于 2025年11月

什么是 Scriban?

Scriban 是一个快速、强大、安全且轻量级的脚本语言和引擎,适用于 .NET,主要用于文本模板。它支持类似 Liquid 的语法,但更加强大和灵活。

高性能

经过优化的解析和渲染引擎,确保快速的模板处理

🔒

安全性

内置安全机制,防止恶意代码执行

易于使用

简洁直观的语法,快速上手

🔧

可扩展

支持自定义函数和对象

💾 变量和表达式

输出变量

使用双花括号输出变量值

{{ name }}
输出:
输出 name 变量的值
{{ user.email }}
输出:
访问对象属性
{{ items[0] }}
输出:
访问数组元素

算术运算

支持基本的数学运算

{{ 10 + 5 }}
输出:
15
{{ price * quantity }}
输出:
计算总价
{{ (a + b) / 2 }}
输出:
平均值

字符串连接

使用 + 连接字符串

{{ "Hello " + name }}
输出:
Hello John
{{ firstName + " " + lastName }}
输出:
全名

🔀 条件语句

if-else 语句

根据条件显示不同内容

{{~ if user.isActive ~}} 用户已激活 {{~ else ~}} 用户未激活 {{~ end ~}}
输出:
条件渲染内容
{{~ if score >= 90 ~}} 优秀 {{~ else if score >= 60 ~}} 及格 {{~ else ~}} 不及格 {{~ end ~}}
输出:
多条件判断

比较运算符

支持各种比较操作

{{ age > 18 }}
输出:
大于
{{ name == "Admin" }}
输出:
等于
{{ items.size != 0 }}
输出:
不等于

逻辑运算符

组合多个条件

{{~ if age > 18 && hasLicense ~}}
输出:
AND 运算
{{~ if isAdmin || isModerator ~}}
输出:
OR 运算
{{~ if !isBlocked ~}}
输出:
NOT 运算

🔄 循环语句

for 循环

遍历数组或集合

{{~ for item in items ~}} {{ item.name }} {{~ end ~}}
输出:
遍历数组
{{~ for product in products ~}} {{ for.index }}: {{ product.title }} {{~ end ~}}
输出:
使用索引
{{~ for user in users ~}} {{~ if for.first ~}}第一个{{~ end ~}} {{~ if for.last ~}}最后一个{{~ end ~}} {{~ end ~}}
输出:
循环状态

循环变量

在循环中可用的特殊变量

{{ for.index }}
输出:
当前索引(从0开始)
{{ for.first }}
输出:
是否第一项
{{ for.last }}
输出:
是否最后一项
{{ for.even }}
输出:
是否偶数项
{{ for.odd }}
输出:
是否奇数项

⚙️ 内置函数

字符串函数

字符串处理相关函数

{{ string.upcase "hello" }}
输出:
HELLO
{{ string.downcase "WORLD" }}
输出:
world
{{ string.capitalize "hello" }}
输出:
Hello
{{ string.truncate text 50 }}
输出:
截断字符串
{{ string.replace text "old" "new" }}
输出:
替换字符串

数组函数

数组操作相关函数

{{ array.size items }}
输出:
数组长度
{{ array.first items }}
输出:
第一个元素
{{ array.last items }}
输出:
最后一个元素
{{ array.join items ", " }}
输出:
连接数组
{{ array.sort items }}
输出:
排序数组

数学函数

数学运算相关函数

{{ math.round 3.7 }}
输出:
4
{{ math.ceil 3.2 }}
输出:
4
{{ math.floor 3.8 }}
输出:
3
{{ math.abs -5 }}
输出:
5

日期函数

日期时间处理

{{ date.now }}
输出:
当前时间
{{ date.format date "%Y-%m-%d" }}
输出:
格式化日期
{{ date.add_days date 7 }}
输出:
添加天数

🔗 管道过滤器

使用管道

使用 | 符号链式调用函数

{{ name | string.upcase }}
输出:
转大写
{{ items | array.size }}
输出:
获取长度
{{ text | string.truncate 50 | string.upcase }}
输出:
链式调用

常用过滤器

常见的过滤器使用

{{ price | math.format "C" }}
输出:
货币格式
{{ items | array.limit 10 }}
输出:
限制数量
{{ html | html.strip }}
输出:
移除HTML标签

📏 空白符控制

波浪号 ~

移除前后的空白符和换行

{{~ if condition ~}} 内容 {{~ end ~}}
输出:
移除两侧空白
{{ ~ variable }}
输出:
移除左侧空白
{{ variable ~ }}
输出:
移除右侧空白

💬 注释

单行注释

使用 ## 添加注释

## 这是一个注释
输出:
不会在输出中显示

多行注释

使用 ##* ... *## 包裹多行注释

##* 这是多行注释 可以写很多行 *##
输出:
不会在输出中显示

最佳实践

使用空白符控制

合理使用 ~ 控制输出格式,避免多余的空行和空格

避免复杂逻辑

模板中应尽量避免复杂的业务逻辑,将逻辑放在数据准备阶段

使用有意义的变量名

选择清晰、描述性的变量名,提高模板可读性

添加注释

为复杂的模板逻辑添加注释,便于维护

测试边界情况

考虑空值、空数组等边界情况,添加适当的条件判断