web-dev-qa-db-ja.com

Twigテンプレートの「で始まる」

twigテンプレートがあり、アイテムが特定の値で始まるかどうかをテストしたい

{% 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はこのように見えるか、またはこのように複雑になる可能性があります。私がやりたい唯一のことは、それが0x0120で始まることを確認することです。

理想的な解決策は正規表現を使用してこれを解決することですが、Twigがこれをサポートしているかどうかはわかりませんか?

ありがとう

29
Eric Herlitz

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

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

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

Twig now:

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

「で終わる」もサポートされています。

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

他にも便利なキーワードがあります:

複雑な文字列比較:

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

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

文字列に含まれるもの:

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

詳細はこちら: http://twig.sensiolabs.org/doc/templates.html#comparisons

93
benske

slice フィルターを使用するだけです。単に行います:

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

必要な比較を実行する独自のフィルターをいつでも作成できます。

docs に従って:

Twigから呼び出されると、PHP callableは、フィルターの左側(パイプ|の前)を最初の引数として受け取り、フィルターに渡される追加の引数(括弧()内)を追加として受け取ります。引数。

これが変更された例です。

フィルターの作成は、名前を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$startsWithで始まります。実装するのは簡単だと思います。

1
ladaghini