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

「Endswith」もサポートされています。

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

他の便利なキーワードも存在します:

複雑な文字列の比較:

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

(注:二重の円記号は、小枝によって1つの円記号に変換されます)

文字列に含まれるもの:

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

詳細については、こちらをご覧ください:http: //twig.sensiolabs.org/doc/templates.html#comparisons

于 2014-05-15T14:27:03.450 に答える
32

はい、Twigは比較で正規表現をサポートしています:http://twig.sensiolabs.org/doc/templates.html#comparisons

あなたの場合は次のようになります。

{% 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が正規表現をどのように実行するかはわかりませんが、上記の無名関数は、で$longString始まる場合にtrueを返すように設計されてい$startsWithます。実装するのは簡単だと思います。

于 2013-03-24T16:37:56.777 に答える