2013-03-24 70 views
13

我有一个树枝模板,我想测试一个项目开始具有一定的价值“开头”,在枝条模板

{% 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是否支持这个?

谢谢

回答

18

是,嫩枝支持比较正则表达式:http://twig.sensiolabs.org/doc/templates.html#comparisons

你的情况,那就是:

{% if item.ContentTypeId matches '/^0x0120.*/' %} 
    ... 
{% else %} 
    ... 
{% endif %} 
+0

酷!有没有什么办法来获取匹配正则表达式的所有数组元素?嗨{%为数组%中的元素} ?? – juanmf 2014-07-02 01:16:48

+6

这是不正确的;这应该是'/^0x0120。* /''或类似的。该字符串直接传递给PHP的'preg_match',它期望额外的分隔符。 – Timwi 2014-07-15 11:38:20

+0

现在您可以使用'starts',请参阅下面的答案。 – benske 2017-11-03 17:22:58

1

您可以随时制作自己的过滤器,进行必要的比较。

作为每docs

当嫩枝调用时,PHP可调用接收(管道之前|)过滤器的左侧作为第一个参数,并传递到过滤器中的额外的参数(内括号())作为额外的参数。

所以这里是一个修改的例子。

创建过滤器是作为一个名称与 调用一个PHP关联简单:

// an anonymous function 
$filter = new Twig_SimpleFilter('compareBeginning', function ($longString, $startsWith) { 
    /* do your work here */ 
}); 

然后,过滤器添加到您的嫩枝环境:

$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如何做的正则表达式,但如果$longString匿名函数以上的目的是返回true从$startsWith开始。我相信你会发现实施起来微不足道。

6

您可以使用slice过滤器。简单地做:

{% if item.ContentTypeId[:6] == '0x0120' %} 
{% endif %} 
66

你可以直接在枝杈现在:

{% 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