39

我有一个树枝模板,我想测试一个项目是否以某个值开头

{% 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 可能看起来像这样或更复杂,例如 0x0120D52000D430D2B0D8DD6F4BBB16123680E4F787006540​​36413B65C740B168E780DA0FB4BX。我唯一想做的就是确保它以 0x0120 开头。

理想的解决方案是使用正则表达式来解决这个问题,但我不知道 Twig 是否支持这个?

谢谢

4

4 回答 4

132

您现在可以直接在 Twig 中执行此操作:

{% if 'World' starts with 'F' %}
{% endif %}

还支持“以”结尾:

{% if 'Hello' ends with 'n' %}
{% endif %}

其他方便的关键字也存在:

复杂的字符串比较:

{% if phone matches '{^[\\d\\.]+$}' %} {% endif %}

(注:双反斜杠被twig转换为一个反斜杠)

字符串包含:

{{ 'cd' in 'abcde' }}
{{ 1 in [1, 2, 3] }}

在此处查看更多信息:http: //twig.sensiolabs.org/doc/templates.html#comparisons

于 2014-05-15T14:27:03.450 回答
32

Yes, Twig supports regular expressions in comparisons: http://twig.sensiolabs.org/doc/templates.html#comparisons

In your case it would be:

{% if item.ContentTypeId matches '/^0x0120.*/' %}
  ...
{% else %}
  ...
{% endif %}
于 2013-11-12T01:01:53.823 回答
8

您可以只使用slice过滤器。只需这样做:

{% if item.ContentTypeId[:6] == '0x0120' %}
{% endif %}
于 2013-03-24T16:47:55.697 回答
1

您始终可以制作自己的过滤器来执行必要的比较。

根据文档

当由 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. 我相信你会发现实现起来很简单。

于 2013-03-24T16:37:56.777 回答