这些内建函数作用于表达式左侧的字符串值。
		如果左侧值是数字或日期/时间/日期-时间或布尔类型(从 2.3.20 版本开始),
		根据当前的number-, date/time/date-time- 和 boolean-format设置,
		那么它会自动被转成字符串值(当使用${...}
		插入这些值时,应用的都是一样的格式程序)。
boolean
字符串转为布尔值。字符串必须是
          true 或 false
		  (大小写敏感!),或者必须是由 boolean_format 
		  设置的特定格式。
如果字符串不是适当的格式,那么当访问该内建函数时, 就会发成错误终止模板处理。
cap_first
字符串中的首单词的首字母大写。 关于"单词"的准确意义,可以参考 word_list 内建函数。 例如:
${"  green mouse"?cap_first}
${"GreEN mouse"?cap_first}
${"- green mouse"?cap_first}将会输出:
Green mouse GreEN mouse - green mouse
In the case of "- green mouse", the first
          word is the -.
capitalize
字符串中所有单词的首字母大写。 关于"单词"的准确意义,可以参考 word_list 内建函数。例如:
${"  green  mouse"?capitalize}
${"GreEN mouse"?capitalize}将会输出:
Green Mouse Green Mouse
chop_linebreak
在末尾没有 换行符 的字符串, 那么可以换行,否则不改变字符串。
contains
这个内建函数从 FreeMarker 2.3.1 版本开始可用。 在2.3版本中是没有的。
如果函数中的参数指定的子串出现在源字符串中, 那么返回true。比如:
<#if "piceous"?contains("ice")>It contains "ice"</#if>将会输出
It contains "ice"
date, time, datetime
字符串转换成日期值,时间或日期-时间值。需要一个由 date_format,
          time_format 和
          datetime_format 设置指定的格式。
		  如果字符串不是适当的格式,那么当访问该内建函数时,
		  就会发生错误中止模板的处理。
<#-- The date_format, time_format and datetime_format settings must match this format! --> <#assign someDate = "Oct 25, 1995"?date> <#assign someTime = "3:05:30 PM"?time> <#assign someDatetime = "Oct 25, 1995 03:05:00 PM"?datetime> <#-- Changing the setting value changes the expected format: --> <#setting datetime_format="iso"> <#assign someDatetime = "1995-10-25T15:05"?datetime>
也可以指定明确的格式,比如
          ?datetime.format 或
          ?datetime["format"]
          (由于历史原因,也可以是
          ?datetime("format")),
		  它们与 ?date 和 ?time是相同的。
		  对于格式化值的语法和意义,可以参考 date_format,
          time_format 和
          datetime_format 设置 的可能的值。 比如:
<#-- Parsing XML Schema xs:date, xs:time and xs:dateTime values: -->
<#assign someDate = "1995-10-25"?date.xs>
<#assign someTime = "15:05:30"?time.xs>
<#assign someDatetime = "1995-10-25T15:05:00"?datetime.xs>
<#-- Parsing ISO 8601 (both extended and basic formats): -->
<#assign someDatetime = "1995-10-25T15:05"?datetime.iso>
<#assign someDatetime = "19951025T1505"?datetime.iso>
<#-- Parsing with SimpleDateFormat patterns: -->
<#assign someDate = "10/25/1995"?date("MM/dd/yyyy")>
<#assign someTime = "15:05:30"?time("HH:mm:ss")>
<#assign someDatetime = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")>避免误解,左侧值无需是字符串文本。比如,当从XML结点
		  (此处的所有值都是未被解析的字符串)读取数据,那么就需要这样来做
          order.confirmDate?date.xs,将字符串转化成真实的日期。
当然,格式也可以是一个变量,比如:
          "..."?datetime[myFormat]。
ends_with
返回是否这个字符串以参数中指定的子串结尾。
		  比如 "ahead"?ends_with("head") 返回布尔值 
		  true。"head"?ends_with("head") 
		  也返回 true。
ensure_ends_with
该内建函数从 FreeMarker 2.3.21 版本开始可用
如果字符串没有以第一个参数指定的子串结尾,
		  那么就会将它加到字符串后面,否则返回原字符串。比如,
          "foo"?ensure_ends_with("/") 和
          "foo/"?ensure_ends_with("/") 返回
          "foo/"。
ensure_starts_with
该内建函数从 FreeMarker 2.3.21 版本开始可用
如果字符串没有以第一个参数指定的子串开头,
		  那么就会将它加到字符串开头,否则返回原字符串。比如,
          "foo"?ensure_starts_with("/") 和
          "/foo"?ensure_starts_with("/") 返回
          "/foo"。
如果指定两个参数,那么第一个参数就被解释成Java正则表达式,
		  如果它不匹配字符串的开头,那么第二个参数指定的字符串就会添加到字符串开头。
		  比如 someURL?ensure_starts_with("[a-zA-Z]+://", "http://") 
		  就会检查如果字符串是否以 "[a-zA-Z]+://" 开头
		  (请注意,不需要 ^),如果不是的话,就添加
		  "http://"。
该方法也接受第三个标志位参数。因为调用两个参数暗指
		  "r"(也就是正则表达式模式),那么就需要第三个参数了。
		  值得注意的一点是当不需要第一参数被解释成正则表达式,而只是普通文本,
		  但是又想让比较是大小写敏感的,那么此时就需要使用 "i"
		  作为第三个参数。
groups
这个函数只作用于内建函数 matches 
		  的结果。请参考 这里...。
html
字符串按照HTML标记输出。也就是说,下面字符串将会被替代:
- 
              <替换为<
- 
              >替换为>
- 
              &替换为&
- 
              "替换为"
- 
              如果程序员设置了FreeMarker(将 incompatible_improvements设置为2.3.20或更高;更多内容请参考 这里),那么'被替换为'。
请注意,如果想安全地插入一个属性,
		  必须在HTML模板中使用引号标记(是 
		  ",而不是 ')为属性值加引号:
<input type=text name=user value="${user?html}">请注意,在HTML页面中,通常想对所有插值使用这个内建函数。
		  所以可以使用 escape
          指令 来节约很多输入,减少偶然错误的机会。
index_of
返回第一次字符串中出现子串时的索引位置。
		  例如 "abcabc"?index_of("bc") 将会返回1
		  (不要忘了第一个字符的索引是0)。而且,你可以指定开始搜索的索引位置:
		  "abcabc"?index_of("bc", 2) 将会返回4。
		  这对第二个参数的数值没有限制:如果它是负数,那就和是0是相同效果了,
		  如果它比字符串的长度还大,那么就和它是字符串长度那个数值是一个效果。
		  小数会被切成整数。
如果第一个参数作为子串没有在该字符串中出现时 (如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1。
j_string
根据Java语言字符串转义规则来转义字符串, 所以它很安全的将值插入到字符串类型中。要注意它 不会 在被插入的值的两侧添加引号; 你需要在字符串值 内部 来使用。
所有 UCS 编码下指向0x20的字符会被转义。
		  当它们在Java语言中(比如\n,\t等)
		  没有专门的转义序列时,将会被用UNICODE进行转义替换
		  (\uXXXX)。
例如:
<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";将会输出:
String BEAN_NAME = "The \"foo\" bean.";
js_string
根据JavaScript语言字符串转义规则来转义字符串, 所以它很安全的将值插入到字符串类型中。要注意, 它不会在被插入的值两侧添加引号; 你需要在字符串值 内部 来使用。
引号(")和单引号(')要被转义。
		  从 FreeMarker 2.3.1 开始,也要将 > 
		  转义为 \>(为了避免 </script>)。
所有在 UCS 
		  编码下指向0x20的字符将会被转义。
		  当它们在JavaScript中没有专用的转义序列时
		  (比如 \n,\t 等),
		  它们会被UNICODE字符代替(\uXXXX)。
例如:
<#assign user = "Big Joe's \"right hand\"">
<script>
  alert("Welcome ${user?js_string}!");
</script>将会输出:
<script>
  alert("Welcome Big Joe\'s \"right hand\"!");
</script>json_string
根据JSON语言的字符串规则来转义字符串, 所以在字符串中插入值是安全的。 要注意它 不会 在被插入的值两侧添加引号; 你需要在字符串值 内部 来使用。
这不会转义 ' 字符,因为JSON字符串必须使用 
		  " 来括起来。它会在 < 
		  之后直接出现的 /(斜杠)字符转义为 \/,
		  来避免 </script> 等。
		  它也会在 ]] 之后转义 > 
		  字符为 \u003E,来避免退出XML的 CDATA 段。
所有在 UCS 编码下指向0x20的字符会被转义。
		  当在JSON中没有专用的转义序列时
		  (比如 \n,\t 等),
		  它们会被UNICODE字符代替(\uXXXX)。
keep_after
该内建函数从 FreeMarker 2.3.21 版本开始可用。
移除字符串中的一部分内容,该部分是给定子串第一次出现之前的部分。 比如:
${"abcdefgh"?keep_after("de")}将会输出
fgh
如果参数字符串没有找到,它会返回空串。如果参数是长度为0的字符串, 它会返回源字符串,不会改变。
该方法接受可选的 标志位参数,作为它的第二个参数:
${"foo : bar"?keep_after(r"\s*:\s*", "r")}将会输出
bar
keep_after_last
该内建函数从 FreeMarker 2.3.22 版本开始可用。
和 keep_after 相同,
		  但是它会保留参数最后一次出现后的部分,而不是第一次。比如:
${"foo.bar.txt"?keep_after_last(".")}将会输出
txt
若使用 keep_after 则会得到
          bar.txt。
keep_before
该内建函数从 FreeMarker 2.3.21 版本开始可用。
移除字符串的一部分,该部分是从给定子串开始的部分。 比如:
${"abcdef"?keep_before("de")}将会输出
abc
如果参数字符串没有找到,它会返回源字符串,不会改变。 如果参数是长度为0的字符串,它会返回空串。
该方法接受可选的 标志位参数,作为它的第二个参数:
${"foo : bar"?keep_before(r"\s*:\s*", "r")}将会输出
foo
keep_before_last
该内建函数从 FreeMarker 2.3.22 版本开始可用。
和 keep_before 相同,
		  但是保留参数最后一次出现之前的部分,而不是第一次出现之前。比如:
${"foo.bar.txt"?keep_after_last(".")}将会输出
foo.bar
若使用 keep_before 则会得到
          foo。
last_index_of
返回最后一次(最右边)字符串中出现子串时的索引位置。
		  它返回子串第一个(最左边)字符所在位置的索引。例如: 
		  "abcabc"?last_index_of("ab"):将会返回3。
		  而且可以指定开始搜索的索引。例如,
		  "abcabc"?last_index_of("ab", 2),将会返回0。
		  要注意第二个参数暗示了子串开始的最大索引。对第二个参数的数值没有限制:
		  如果它是负数,那么效果和是零的一样,如果它比字符串的长度还大,
		  那么就和它是字符串长度那个数值是一个效果。小数会被切成整数。
如果第一个参数作为子串没有在该字符串中出现时 (如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1。
left_pad
该内建函数从 FreeMarker 2.3.1 版本开始可用。
如果它仅仅用1个参数,那么它将在字符串的开始插入空白, 直到整个串的长度达到参数指定的值。 如果字符串的长度达到指定数值或者比指定的长度还长, 那么就什么都不做了。比如这样:
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"ab"?left_pad(5)}]
[${"abc"?left_pad(5)}]
[${"abcd"?left_pad(5)}]
[${"abcde"?left_pad(5)}]
[${"abcdef"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
[${"abcdefgh"?left_pad(5)}]将会输出:
[ ] [ a] [ ab] [ abc] [ abcd] [abcde] [abcdef] [abcdefg] [abcdefgh]
如果使用了两个参数,那么第一个参数表示的含义和你使用一个参数时的相同, 第二个参数指定用什么东西来代替空白字符。比如:
[${""?left_pad(5, "-")}]
[${"a"?left_pad(5, "-")}]
[${"ab"?left_pad(5, "-")}]
[${"abc"?left_pad(5, "-")}]
[${"abcd"?left_pad(5, "-")}]
[${"abcde"?left_pad(5, "-")}]将会输出:
[-----] [----a] [---ab] [--abc] [-abcd] [abcde]
第二个参数也可以是个长度比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")}]将会输出:
[.oO.oO.o] [.oO.oO.a] [.oO.oOab] [.oO.oabc] [.oO.abcd]
第二个参数必须是个字符串值,而且至少有一个字符。
length
字符串中字符的数量。
lower_case
字符串的小写形式。比如 
		  "GrEeN MoUsE"?lower_case 
		  将会是 "green mouse"。
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>将会输出:
Matches. Does not match. Matching sub-strings: - foo - fyo
如果正则表达式包含分组(圆括号),那么可以使用
		  groups 内建函数来访问它们:
<#-- Entire input match -->
<#assign res = "John Doe"?matches(r"(\w+) (\w+)")>
<#if res> <#-- Must not try to access groups if there was no match! -->
  First name: ${res?groups[1]}
  Second name: ${res?groups[2]}
</#if>
<#-- Subtring matches -->
<#assign res = "aa/rx; ab/r;"?matches("(.+?)/*(.+?);")>
<#list res as m>
  - "${m}" is "${m?groups[1]}" per "${m?groups[2]}"
</#list>将会输出:
First name: John Second name: Doe - "aa/rx;" is "a" per "a/rx" - " ab/r;" is " " per "ab/r"
请注意,上面的 groups 
		  对子串匹配和整个字符串匹配的结果都起作用。
matches 接受可选的第二参数,
          标志位。请注意,
		  它不支持标志 f,也会忽略 
          r 标志。
number
字符串转化为数字格式。这个数字必须是 "计算机语言" 格式。也就是说, 它必须是本地化独立的形式,小数的分隔符就是一个点,没有分组。
该内建函数识别FreeMarker模板语言使用的数字格式。此外,
		  它也识别科学记数法(比如 "1.23E6","1.5e-8")
		  从 FreeMarker 2.3.21 版本开始,它也识别所有XML Schema数字格式,比如 
		  NaN,INF,-INF,
		  还有Java本地格式Infinity 和 -Infinity。
如果字符串不是适当的格式,当尝试访问该内建函数时就会发生错误, 并中止模板执行。
实际上,字符串是由当前
		  arithmetic_engine 的 toNumber 
		  方法解析的,这是可以配置的设置项。不过该方法应该和上面描述的行为相似。
		  
replace
在源字符串中,用另外一个字符串来替换原字符串中出现它的部分。 它不处理词的边界。比如:
${"this is a car acarus"?replace("car", "bulldozer")}将会输出:
this is a bulldozer abulldozerus
替换是从左向右执行的。这就意味着:
${"aaaaa"?replace("aaa", "X")}将会输出:
Xaa
如果第一个参数是空字符串,那么所有的空字符串将会被替换,
		  比如 "foo"?replace("","|"),就会得到 
		  "|f|o|o|"。
replace 接受可选的 标志位参数,作为它的第三参数。
right_pad
该内建函数从 FreeMarker 2.3.1 版本开始可用。 在2.3版本中是没有的。
它和 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)}]
[${""?right_pad(8, ".oO")}]
[${"a"?right_pad(8, ".oO")}]
[${"ab"?right_pad(8, ".oO")}]
[${"abc"?right_pad(8, ".oO")}]
[${"abcd"?right_pad(8, ".oO")}]将会输出:
[ ] [a ] [ab ] [abc ] [abcd ] [abcde] [abcdef] [abcdefg] [abcdefgh] [.oO.oO.o] [aoO.oO.o] [abO.oO.o] [abc.oO.o] [abcdoO.o]
remove_beginning
该内建函数从 FreeMarker 2.3.21 版本开始可用。
从字符串的开头移除参数中的子串,如果它不以参数中的子串开头, 那么就或者返回原字符串。比如:
${"abcdef"?remove_beginning("abc")}
${"foobar"?remove_beginning("abc")}将会输出:
def foobar
remove_ending
该内建函数从 FreeMarker 2.3.21 版本开始可用。
从字符串的结尾移除参数中的子串,如果它不以参数中的子串结尾, 那么就或者返回原字符串。比如:
${"abcdef"?remove_ending("def")}
${"foobar"?remove_ending("def")}将会输出:
abc foobar
rtf
字符串作为富文本(RTF 文本),也就是说,下列字符串:
- 
              \替换为\\
- 
              {替换为\{
- 
              }替换为\}
split
它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。 比如:
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>将会输出:
- some - test - text
请注意,假设所有的分隔符都在新项之前出现
		  (除了使用 "r" 标志 - 后面详细介绍)
		  因此:
<#list "some,,test,text,"?split(",") as x>
- "${x}"
</#list>将会输出:
- "some" - "" - "test" - "text" - ""
split 接受可选的 标志位参数,
		  作为它的第二个参数。由于历史使用 r 
		  (正则表达式)标志的差错;它会从结果列表中移除空元素,
		  所以在最后示例中使用 ?split(",", "r"),
		  "" 会从输出中消失。
要检查一个字符串是否以...结尾或者要附加它,
			使用  
            ensure_ends_with 内建函数。
starts_with
如果字符串以指定的子字符串开头,那么返回true。
		  比如 "redirect"?starts_with("red") 返回布尔值 
		  true,而且 "red"?starts_with("red") 
		  也返回 true。
要检查一个字符串是否以...开头或者要在前面附加它,
            使用  
            ensure_starts_with 内建函数。
string (当被用作是字符串值时)
什么也不做,仅仅返回和其内容一致的字符串。例外的是, 如果值是一个多类型的值(比如同时有字符串和序列两种), 那么结果就只是一个简单的字符串,而不是多类型的值。 这可以被用来防止人为多输入。
substring (已废弃)
从 FreeMarker 2.3.21 版本开始,该内建函数被废弃,由 字符串切分  替代,比如
            str[from..<toExclusive],
            str[from..],
            和
            str[from..*maxLength]。
如果处理XML那么有一点警示:因为分割表达式作用于序列和字符串,
			而且XML结点通常既是序列又是字符串,那么相等的表达式是
            someXmlNode?string[from..<toExclusive]
            和
            exp?string[from..],
            因为没有 ?string 它会分割结点序列而不是结点的字符串值。
一些典型的字符串分割的用例已经由一些内建函数方便地实现: remove_beginning,
            remove_ending,
            keep_before,
            keep_after,
            keep_before_last,
            keep_after_last
概要:
          exp?substring(from,
          toExclusive),也可以使用 
          exp?substring(from)
		  调用。
字符串的子串
          from 是第一个字符的索引。
		  它必须是数字,最小是0并且小于或等于
          toExclusive,
		  否则就会发生错误并且中止模板处理。
          toExclusive 
		  是子串最后一个字符之后的字符位置索引,换句话说,它比最后一个字符的索引大1。
		  它必须是一个数字,最小是0并且小于或等于字符串的长度,
		  否则就会发生错误并且中止模板处理。如果
          toExclusive 被忽略了,
		  那么默认就是字符串的长度。如果参数是数字但不是整数,
		  那么只有数字中的整数部分会被使用。
例如:
- ${'abc'?substring(0)}
- ${'abc'?substring(1)}
- ${'abc'?substring(2)}
- ${'abc'?substring(3)}
- ${'abc'?substring(0, 0)}
- ${'abc'?substring(0, 1)}
- ${'abc'?substring(0, 2)}
- ${'abc'?substring(0, 3)}
- ${'abc'?substring(0, 1)}
- ${'abc'?substring(1, 2)}
- ${'abc'?substring(2, 3)}将会输出:
- abc - bc - c - - - a - ab - abc - a - b - c
trim
去掉字符串首尾的空格。例如:
(${"  green mouse  "?trim})将会输出:
(green mouse)
uncap_first
和 cap_first 相反。
		  字符串中所有单词的首字母小写。
upper_case
字符串的大写形式。比如
          "GrEeN MoUsE" 将会是 "GREEN
          MOUSE".
url
该内建函数从 FreeMarker 2.3.1 版本开始可用。 在2.3版本中是没有的。
在URL之后的字符串进行转义。这意味着,
		  所有非US-ASCII的字符和保留的URL字符将会被 
		  %XX 形式转义。例如:
<#assign x = 'a/b c'>
${x?url}将会输出(假设用来转义的字符集是US-ASCII兼容的字符集):
a%2Fb%20c
请注意,它会转义 所有 保留的URL字符
		  (/, =,
          &,等...),
		  所以编码可以被用来对查询参数的值进行,比如:
<a href="foo.cgi?x=${x?url}&y=${y?url}">Click here...</a>上面的没有HTML编码(?html)是需要的,
			因为URL转义所有保留的HTML编码。但是要小心:通常引用的属性值,
			用普通引号(")包括,而不是单引号
			('),因为单引号是不被URL转义的。
为了进行URL转义,必须要选择 字符集,它被用来计算被转义的部分
		  (%XX)。
		  如果你是HTML页面设计者,而且你不懂这个,不要担心:
		  程序员应该配置 FreeMarker,则它默认使用恰当的字符集
		  (程序员应该多看看下面的内容...)。
		  如果你是一个比较热衷于技术的人,那么你也许想知道被 
		  url_escaping_charset 设置的指定字符集,
		  它可以在模板的执行时间设置(或者,更好的是,由程序员之前设置好)。例如:
<#--
  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>如果内建函数 url 没有参数,
			那么它会使用由 url_escaping_charset 设置的字符集。
			这个设置应该被软件设置,包括 FreeMarker(比如Web应用框架),
			因为它默认不会被设置(null)。
			如果它没有被设置,那么 FreeMarker 退回使用 output_encoding 
			的设置,这个也会被默认设置,所以它也是又软件设置的。
			如果 output_encoding 也没有被设置,
			那么没有参数的内建函数 url 将不会被执行,
			而且它会引起运行时错误。当然,有参数的 url 函数将会执行。
用 setting 
		  指令在模板中设置 url_escaping_charset 是可能的。
		  至少在真实的MVC应用中,这是一个不好的实践行为。output_encoding 
		  不能由 setting 指令来设置,所以它应该是软件的工作。
		  你可以阅读 这里... 来获取更多信息。
url_path
该内建函数从 FreeMarker 2.3.21 版本开始可用。
它和 
          url 内建函数 相同,只是它不转义斜杠
          (/)字符。这就是意味着用来转义使用了斜杠(不是反斜杠!)的路径
		  (比如操作系统或一些内容仓库的路径),转义之后它们可以插入到URL中。
		  需要该转义的常用原因是文件夹名称或文件名称可能含有非US-ASCII字母
		  ("国家" 标准符号)。
和 the
            url 内建函数 相似,希望的URL转义字符
			(或者后退,输出编码)必须要在 FreeMarker的配置设置项中设置,
			否则内建函数就会报错。或者可以指定字符集,比如 
			somePath?url_path('utf-8')。
word_list
包含字符串中所有单词的序列,顺序为出现在字符串中的顺序。 单词是不间断的字符序列,包含了任意字符,但是没有 空白。例如:
<#assign words = "   a bcd, .   1-2-3"?word_list>
<#list words as word>[${word}]</#list>将会输出:
[a][bcd,][.][1-2-3]
xhtml
字符串作为XHTML格式文本,下面这些:
- 
              <替换为<
- 
              >替换为>
- 
              &替换为&
- 
              "替换为"
- 
              '替换为'
该内建函数和 xml 内建函数的唯一不同是 
		  xhtml内建函数转义 ' 
		  为 ',而不是 ',
		  因为一些老版本的浏览器不能正确解释 '。
xml
字符串作为XML格式文本,下面这些:
- 
              <替换为<
- 
              >替换为>
- 
              &替换为&
- 
              "替换为"
- 
              '替换为'
通用标志
很多字符串内建函数接受可选的字符串参数,
		  它们被称为"标志"。在这个字符串中,每个字母影响内建函数一个特定方面的行为。
		  比如,字母 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')}
i: ${s?replace('ba', 'XY', 'i')}
if: ${s?replace('ba', 'XY', 'if')}
r: ${s?replace('ba*', 'XY', 'r')}
ri: ${s?replace('ba*', 'XY', 'ri')}
rif: ${s?replace('ba*', 'XY', 'rif')}将会输出:
foo bAr XYar i: foo XYr XYar if: foo XYr baar r: foo XYAr XYr ri: foo XYr XYr rif: foo XYr baar
下表是支持使用这些通用标志的内建函数:
| 内建函数 | i(忽略大小写) | r(正则表达式) | m(多行模式) | s(dot-all模式) | c(空白和注释) | f(仅第一个) | 
|---|---|---|---|---|---|---|
| replace | 是 | 是 | 仅 r | 仅 r | 仅 r | 是 | 
| split | 是 | 是 | 仅 r | 仅 r | 仅 r | 否 | 
| matches | 是 | 忽略 | 是 | 是 | 是 | 否 | 
| keep_after | 是 | 是 | 是 | 是 | 是 | 忽略 | 
| keep_after_last | 是 | 是 | 是 | 是 | 是 | 忽略 | 
| keep_before | 是 | 是 | 是 | 是 | 是 | 忽略 | 
| keep_before_last | 是 | 是 | 是 | 是 | 是 | 忽略 | 
| ensure_starts_with | 是 | 忽略 | 是 | 是 | 是 | 忽略 | 
