字符串内建函数
1.boolean
字符串转为布尔值。字符串必须是 true 或 false (大小写敏感!),或者必须是由 boolean_format 设置的特定格式。
如果字符串不是适当的格式,那么当访问该内建函数时, 就会发成错误终止模板处理。
2.cap_first
字符串中的首单词的首字母大写${" green mouse"?cap_first}
${"GreEN mouse"?cap_first}
<#-- In the case of "- green mouse", the first word is the -. -->
${"- green mouse"?cap_first}
3.capitalize
字符串中的首单词的首字母大写${" green mouse"?capitalize}
${"GreEN mouse"?capitalize}
4.chop_linebreak
在末尾没有 换行符 的字符串, 那么可以换行,否则不改变字符串5.contains
如果函数中的参数指定的子串出现在源字符串中, 那么返回true<#if "piceous"?contains("ice")>
<font color="green">It contains "ice"</font>
</#if>
${"piceous"?contains("ice")?string}
6.date, time, datetime
字符串转换成日期值,时间或日期-时间值。需要一个由 date_format, time_format 和 datetime_format 设置指定的格式。
如果字符串不是适当的格式,那么当访问该内建函数时, 就会发生错误中止模板的处理
<#assign date1="2009-10-12"?date("yyyy-MM-dd")>
<#assign date2="9:28:20"?time("HH:mm:ss")>
<#assign date3=" 2009-10-12 9:28:20"?datetime("yyyy-MM-dd HH:mm:ss")>
<#-- 结果为2009-10-12 -->
${date1}
<#-- 结果为9:28:20 -->
${date2}
<#-- 结果为2009-10-12 9:28:20 -->
${date3}
<#-- 中文手册:http://freemarker.foofun.cn/ref_builtins_string.html#ref_builtin_string_date -->
<#assign someDate = "1995-10-25"?date.xs>
${someDate}
<#assign someTime = "15:05:30"?time.xs>
${someTime}
<#assign someDatetime = "1995-10-25T15:05:00"?datetime.xs>
${someDatetime}
7.ends_with
返回是否这个字符串以参数中指定的子串结尾比如 “ahead”?ends_with(“head”) 返回布尔值 true。
“head”?ends_with(“head”) 也返回 true
<#-- true -->
${"ahead"?ends_with("head")?string}
<#-- true -->
${"string"?ends_with("ing")?string}
8.ensure_ends_with
如果字符串没有以第一个参数指定的子串开头, 那么就会将它加到字符串开头,否则返回原字符串。比如, “foo”?ensure_starts_with("/") 和 “/foo”?ensure_starts_with("/") 返回 “/foo”
<#-- /foo -->
${"foo"?ensure_starts_with("/")?string}
<#-- :/foo -->
${"/foo"?ensure_starts_with(":")?string}
8.groups
这个函数只作用于内建函数 matches 的结果"9.matches
???????????? 这是一个"超级用户"函数。如果不懂 正则表达式,就忽略它吧。该内建函数决定了字符串是否精确匹配模式。而且,它会返回匹配子串的列表。
返回值是多类型值:
布尔值:如果字符串整体匹配了模式,就是 true, 否则就是 false。
比如:“fooo”?matches(‘fo*’) 就是 true,但是 “fooo bar”?matches(‘fo*’) 是 false。
序列:字符串匹配的子串的列表。很有可能是长度为0的序列
<#if "fxo"?matches("f.?o")>Matches.<#else>Does not match.</#if>
<#assign res = "foo bar fyo"?matches("f.?o")>
<#if res>Matches.<#else>Does not match.</#if>
Matching sub-strings:
<#list res as m>
- ${m}
</#list>
10.html
字符串按照HTML标记输出面字符串将会被替代:< 替换为 <
> 替换为 >
& 替换为 &
" 替换为 "
' 被替换为 '
请注意,如果想安全地插入一个属性,
必须在HTML模板中使用引号标记(是 ",而不是 ')为属性值加引号
11.index_of
返回第一次字符串中出现子串时的索引位置<#-- 1 -->
${"abcabcgbbc"?index_of("bc")}
<#-- 指定开始搜索的索引位置 -->
${"abcabcgbbc"?index_of("bc",2)}
<#-- 当指定开始搜索的索引位置是-1的时候效果和0相同 -->
${"abcabcgbbc"?index_of("bc",-1)}
<#-- 如果第一个参数作为子串没有在该字符串中出现时
(如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1 -->
${"abcabcgbbc"?index_of("e")}
12.j_string
根据Java语言字符串转义规则来转义字符串, 所以它很安全的将值插入到字符串类型中。要注意它 不会 在被插入的值的两侧添加引号;
你需要在字符串值 内部 来使用
<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";
13.json_string
根据JSON语言的字符串规则来转义字符串, 所以在字符串中插入值是安全的。要注意它 不会 在被插入的值两侧添加引号;
你需要在字符串值 内部 来使用。
这不会转义 ’ 字符,因为JSON字符串必须使用 " 来括起来
Freemarker输出json和java字符串以及javascript代码转义
Java 语言规则的字符串转义:${content?j_string}
JavaScript 语言规则的字符串转义:${content?js_string}
JSON 规则的字符串转义:${content?json_string}
14.keep_after
移除字符串中的一部分内容,该部分是给定子串第一次出现之前的部分(出现的在给的后面,而且是第一次出现的前面的内容)如果参数字符串没有找到,它会返回空串。
如果参数是长度为0的字符串, 它会返回源字符串,不会改变。
该方法接受可选的 标志位参数,作为它的第二个参数
<#-- fgh -->
${"abcdefgh"?keep_after("de")}
<#-- 当定义的字符串没有在原来字符串中出现要返回空字符串 -->
<#-- 什么都没有 -->
${"abcdefgh"?keep_after("zz")}
<#-- 该方法接受可选的 标志位参数,作为它的第二个参数 -->
<#-- bar -->
${"foo : bar"?keep_after(r"\s*:\s*", "r")}
15.keep_after_last
它会保留参数最后一次出现后的部分(所以应该是出现的在给的后面,而且是最后一次出现的后面的内容)<#-- txt -->
${"foo.bar.txt"?keep_after_last(".")}
<#-- bar.txt -->
${"foo.bar.txt"?keep_after(".")}
16.keep_before
移除字符串的一部分,该部分是从给定子串开始的部分(所以应该是出现的在给的前面)如果参数字符串没有找到,它会返回源字符串,不会改变。
如果参数是长度为0的字符串,它会返回空串
<#-- abc -->
${"abcdef"?keep_before("de")}
<#-- 该方法接受可选的 标志位参数,作为它的第二个参数 -->
<#-- foo -->
${"foo : bar"?keep_before(r"\s*:\s*", "r")}
17.keep_before_last
保留参数最后一次出现之前的部分,而不是第一次出现之前(所以应该是出现的在给的前面,而且是最后一次出现的前面内容)<#-- txt -->
${"foo.bar.txt"?keep_after_last(".")}
<#-- foo -->
${"foo.bar.txt"?keep_before(".")}
18.last_index_of
返回最后一次(最右边)字符串中出现子串时的索引位置。它返回子串第一个(最左边)字符所在位置的索引
<#-- 3 -->
${"abcabc"?last_index_of("ab")}
<#-- 注意第二个参数暗示了子串开始的最大索引 -->
<#-- 0 -->
${"abcabc"?last_index_of("ab",2)}
<#-- 3 -->
${"abcabc"?last_index_of("ab",3)}
<#-- 如果它是负数,那么效果和是零的一样,
如果它比字符串的长度还大, 那么就和它是字符串长度那个数值是一个效果。
小数会被切成整数 ????????????-->
<#-- -1 -->
${"abcabc"?last_index_of("ab",-1)}
<#-- 0 -->
${"abcabc"?last_index_of("ab",0)}
19.left_pad
如果它仅仅用1个参数,那么它将在字符串的开始插入空白, 直到整个串的长度达到参数指定的值。如果字符串的长度达到指定数值或者比指定的长度还长, 那么就什么都不做了
<#-- 如果它仅仅用1个参数,那么它将在字符串的开始插入空白,
直到整个串的长度达到参数指定的值 -->
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"ab"?left_pad(5)}]
[${"abc"?left_pad(5)}]
[${"abcd"?left_pad(5)}]
<hr>
<#-- 如果字符串的长度达到指定数值或者比指定的长度还长, 那么就什么都不做了 -->
[${"abcde"?left_pad(5)}]
[${"abcdef"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
[${"abcdefgh"?left_pad(5)}]
<hr>
<#-- 如果使用了两个参数,
那么第一个参数表示的含义和你使用一个参数时的相同,
第二个参数指定用什么东西来代替空白字符 (类似占位符) -->
[${""?left_pad(5, "-")}]
[${"a"?left_pad(5, "-")}]
[${"ab"?left_pad(5, "-")}]
[${"abc"?left_pad(5, "-")}]
[${"abcd"?left_pad(5, "-")}]
[${"abcde"?left_pad(5, "-")}]
<#-- 第二个参数也可以是个长度比1大的字符串。
那么这个字符串会周期性的插入 -->
[${""?left_pad(8, ".oO")}]
[${"a"?left_pad(8, ".oO")}]
[${"ab"?left_pad(8, ".oO")}]
[${"abc"?left_pad(8, ".oO")}]
[${"abcd"?left_pad(8, ".oO")}]
20.length
字符串中字符的数量<#-- 5 -->
${"alice"?length}
21.lower_case
字符串的小写形式<#-- alice -->
${"ALICE"?lower_case}
<#-- 字符串的大写形式 -->
<#-- ALICE -->
${"alice"?upper_case}
22.number
字符串转化为数字格式它必须是本地化独立的形式,小数的分隔符就是一个点,没有分组
<#-- 111.11 -->
${"111.11"?number}
<#-- 1230000 -->
${"1.23E6"?number}
<#-- 0 -->
${"1.5e-8"?number}
<#-- � -->
${"NaN"?number}
<#-- ∞ -->
${"INF"?number}
<#-- -∞ -->
${"-INF"?number}
<#-- ∞ -->
${"Infinity"?number}
<#-- -∞ -->
${"-Infinity"?number}
mX:小数部分最小X位
MX:小数部分最大X位
例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 输出2.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m2} <#-- 输出2.58 -->
#{y; m2} <#-- 输出4.00 -->
#{x; m1M2} <#-- 输出2.58 -->
#{y; m1M2} <#-- 输出4.0 -->
23.replace
在源字符串中,用另外一个字符串来替换原字符串中出现它的部分。它不处理词的边界
替换是从左向右执行的
如果第一个参数是空字符串,那么所有的空字符串将会被替换
<#-- this is a bulldozer abulldozerus -->
${"this is a car acarus"?replace("car", "bulldozer")}
<#-- 替换是从左向右执行的 -->
<#-- Xaa -->
${"aaaaa"?replace("aaa", "X")}
<#-- 如果第一个参数是空字符串,那么所有的空字符串将会被替换 -->
<#-- |f|o|o| -->
${"foo"?replace("","|")}
24.right_pad
它和 left_pad 相同, 但是它从末尾开始插入字符而不是从开头[${""?right_pad(5)}]
[${"a"?right_pad(5)}]
[${"ab"?right_pad(5)}]
[${"abc"?right_pad(5)}]
[${"abcd"?right_pad(5)}]
[${"abcde"?right_pad(5)}]
[${"abcdef"?right_pad(5)}]
[${"abcdefg"?right_pad(5)}]
[${"abcdefgh"?right_pad(5)}]
<hr>
<#-- 从左向右补充,原有位置上如果有元素怎么本身循环替代的不显示 -->
[${""?right_pad(8, ".oO")}]
[${"a"?right_pad(8, ".oO")}]
[${"ab"?right_pad(8, ".oO")}]
[${"abc"?right_pad(8, ".oO")}]
[${"abcd"?right_pad(8, ".oO")}]
25.remove_beginning
从字符串的开头移除参数中的子串(把第一次出现这个子串的删除),如果它不以参数中的子串开头, 那么就或者返回原字符串
<#-- def -->
${"abcdef"?remove_beginning("abc")}
<#-- 1abc1def -->
${"abc1abc1def"?remove_beginning("abc")}
<#-- foobar -->
${"foobar"?remove_beginning("abc")}
26.remove_ending
从字符串的结尾移除参数中的子串,如果它不以参数中的子串结尾, 那么就或者返回原字符串<#-- abc -->
${"abcdef"?remove_ending("def")}
<#-- abcabcdef -->
${"abcabcdefdef"?remove_ending("def")}
<#-- foobar -->
${"foobar"?remove_ending("def")}
27.rtf
字符串作为富文本(RTF 文本),也就是说,下列字符串:
\ 替换为 \\
{ 替换为 \{
} 替换为 \}
28.split
它被用来根据另外一个字符串的出现将原字符串分割成字符串序列<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
<#-- 假设所有的分隔符都在新项之前出现 (除了使用 "r" 标志 - 后面详细介绍) -->
<#list "some,,test,text,"?split(",") as x>
- "${x}"
</#list>
<#-- split 接受可选的 标志位参数, 作为它的第二个参数。
由于历史使用 r (正则表达式)标志的差错;
它会从结果列表中移除空元素, 所以在最后示例中使用 ?split(",", "r"), "" 会从输出中消失 -->
<#list "some,,test,text,"?split(",","r") as x>
- "${x}"
</#list>
29.starts_with
如果字符串以指定的子字符串开头,那么返回true
<#-- true -->
${"redirect"?starts_with("red")?string}
<#-- true -->
${"red"?starts_with("red")?string}
<#-- false -->
${"redirect"?starts_with("dir")?string}
30.string(当被用作是字符串值时)
string (当被用作是字符串值时) 什么也不做,仅仅返回和其内容一致的字符串。例外的是, 如果值是一个多类型的值(比如同时有字符串和序列两种),
那么结果就只是一个简单的字符串,而不是多类型的值。
这可以被用来防止人为多输
31.trim
去掉字符串首尾的空格 (${" green mouse "?trim}) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190807104306607.png)32.uncap_first
uncap_first和 cap_first 相反。 字符串中所有单词的首字母小写(${"Green mouse"?uncap_first})
<br>
(${"GREEN MOUSE"?uncap_first})
33.url
在URL之后的字符串进行转义<#assign x = 'a/b c'>
${x?url}
<#-- 它会转义 所有 保留的URL字符 (/, =, &,等...),
所以编码可以被用来对查询参数的值进行 -->
<a href="foo.cgi?x=${x?url}&y=${y?url}">Click here...</a>
<#-- 为了进行URL转义,必须要选择 字符集,它被用来计算被转义的部分 (%XX) -->
<#--
This will use the charset specified by the programmers
before the template execution has started.
-->
<a href="foo.cgi?x=${x?url}">foo</a>
<#-- Use UTF-8 charset for URL escaping from now: -->
<#setting url_escaping_charset="UTF-8">
<#-- This will surely use UTF-8 charset -->
<a href="bar.cgi?x=${x?url}">bar</a>
<#-- 此外,你可以明确地指定一个为单独URL转义的字符集,作为内建函数的参数 -->
<#-- <a href="foo.cgi?x=${x?url('ISO-8895-2')}">foo</a> -->
34.url_path
和 url 内建函数 相同,只是它不转义斜杠 (/)字符。这就是意味着用来转义使用了斜杠(不是反斜杠!)的路径 (比如操作系统或一些内容仓库的路径),
转义之后它们可以插入到URL中
url_path('utf-8')
35.word_list
包含字符串中所有单词的序列,顺序为出现在字符串中的顺序。单词是不间断的字符序列,包含了任意字符,但是没有 空白
<#assign words = " a bcd, . 1-2-3"?word_list>
<#list words as word>[${word}]</#list>
36.xhtml
< 替换为 <
> 替换为 >
& 替换为 &
" 替换为 "
' 替换为 '
该内建函数和 xml 内建函数的唯一不同是 xhtml内建函数转义 ' 为 ',
而不是 ',
因为一些老版本的浏览器不能正确解释 '。
37.xml
< 替换为 <
> 替换为 >
& 替换为 &
" 替换为 "
' 替换为 '
38.通用标志
很多字符串内建函数接受可选的字符串参数, 它们被称为"标志"。在这个字符串中,每个字母影响内建函数一个特定方面的行为。
比如,字母 i 说明内建函数不应该区别相同字母的小写和大写变化。
标志字符串中的字母顺序是不重要的
下面是字母(标志)的完整列表:
-
i:大小写敏感: 不区别相同字母的小写和大写变化。
-
f:只是第一个。也就是说, 替换/查找/等…,只是第一个出现的地方。
-
r:查找的子串是 正则表达式。 FreeMarker 使用的正则表达式变量可以在 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html 中找到(请注意,一些模式规则特性的出现基于所使用的Java版本)。
-
m:正则表达式的多行模式。在多行正则表达式 ^ 和 $ 仅仅匹配之后或之前, 各自匹配行终止符或字符串结尾。默认情况下,这些表达式仅仅匹配完整字符串的开头和结尾。 请注意,^ 和 $ 不匹配换行符字符本身。
-
s:开启正则表达式的dot-all模式 (和Perl的单行模式相同)。在dot-all模式下,表达式 . 匹配任意字符串,包含行终止符。 默认情况下,该表达式不匹配行终止符。
-
c: 允许正则表达式中的空白和注释。
<#assign s = 'foo bAr baar'>
${s?replace('ba', 'XY')}
<br>
i: ${s?replace('ba', 'XY', 'i')}
<br>
if: ${s?replace('ba', 'XY', 'if')}
<br>
r: ${s?replace('ba*', 'XY', 'r')}
<br>
ri: ${s?replace('ba*', 'XY', 'ri')}
<br>
rif: ${s?replace('ba*', 'XY', 'rif')}