2013-03-24 117 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