我有一个小模板,我想测试一个项目是否以某个值开始
{% if item.ContentTypeId == '0x0120' %}
<td><a href='?parentId={{ item.Id }}'>{{ item.BaseName }}</a><br /></td>
{% else %}
<td><a href='?{{ item.UrlPrefix }}'>{{ item.LinkFilename }}</a></td>
{% endif %}
0x0120可以看起来像这样,或者更复杂,像这样0x0120D52000D430D2B0D8DD6F4BBB16123680E4F78700654036413B65C740B168E780DA0FB4BX。我唯一想做的就是确保它以0x0120开头。
理想的解决方案是通过使用正则表达式来解决这个问题,但我不知道Twig是否支持这个?
谢谢
您现在可以直接在Twig中这样做:
{% if 'World' starts with 'F' %}
{% endif %}
也支持"以"结尾:
{% if 'Hello' ends with 'n' %}
{% endif %}
其他方便的关键字也存在:
复杂字符串比较:
{% if phone matches '{^[\d\.]+$}' %} {% endif %}
(注:双反斜杠被树枝转换成一个反斜杠)
字符串包含:
{{ 'cd' in 'abcde' }}
{{ 1 in [1, 2, 3] }}
查看更多信息:http://twig.sensiolabs.org/doc/templates.html#comparisons
是的,Twig支持正则表达式的比较:http://twig.sensiolabs.org/doc/templates.html#comparisons
在你的例子中应该是:
{% if item.ContentTypeId matches '/^0x0120.*/' %}
...
{% else %}
...
{% endif %}
您可以只使用slice
过滤器。只是做:
{% if item.ContentTypeId[:6] == '0x0120' %}
{% endif %}
您可以创建自己的过滤器来执行必要的比较。
根据文档:
当被Twig调用时,PHP可调用对象接收过滤器的左侧(在管道|之前)作为第一个参数,并接收传递给过滤器的额外参数(在括号()中)作为额外参数。
这是一个修改后的例子
创建过滤器就像将名称与PHP关联一样简单可调用:
// an anonymous function
$filter = new Twig_SimpleFilter('compareBeginning', function ($longString, $startsWith) {
/* do your work here */
});
然后,将滤镜添加到你的Twig环境:
$twig = new Twig_Environment($loader);
$twig->addFilter($filter);
下面是如何在模板中使用它:
{% if item.ContentTypeId | compareBeginning('0x0120') == true %}
{# not sure of the precedence of | and == above, may need parentheses #}
我不是一个PHP的家伙,所以我不知道PHP是如何做正则表达式的,但是上面的匿名函数被设计为返回true,如果$longString
以$startsWith
开始。