小枝で文字列を連結する方法


回答:


872

これはうまくいくはずです:

{{ 'http://' ~ app.request.host }}

同じタグに「trans」などのフィルターを追加するには

{{ ('http://' ~ app.request.host) | trans }}

アダムElsodaneyが指摘する、あなたも使用できる文字列の補間を、この二重引用符で囲まれた文字列を必要としません。

{{ "http://#{app.request.host}" }}

3
答えてくれてありがとう。しかし、それは| トランスフィルターは機能しません(例:{{'test_'〜name | trans}}は私のアイテムを翻訳しません。その方法を知っていますか?thx!
guillaumepotier

12
はい、連結した文字列を保持する変数を作成する必要があります。例:{% set foo = 'http://' ~ app.request.host %}。そして、あなたは行うことができます:{{ foo | trans }}
アレッサンドロDesantis

75
1行での翻訳:{{( 'test_'〜name)| trans}}
ジョニー

6
ありがとうございました。したがって問題は、フィルターが連結演算子よりも優先順位が高いことです。
Alessandro Desantis 2012年

これは、関数に渡された文字列を1つの引数として連結し、変数と関数トークン自体にフィルターをかけることで機能しました{{ form_open('admin/files/?path='~file_path|urlencode)|raw }}。追加の変数は必要ありません。
Wesley Murch、2012年


26

あなたが探している演算子は、アレッサンドロが言ったように、ティルデ(〜)であり、ここではドキュメントにあります:

〜:すべてのオペランドを文字列に変換し、それらを連結します。{{"こんにちは"〜名前〜 "!" }}が返されます(名前が 'John'であると想定)Hello John!。– http://twig.sensiolabs.org/doc/templates.html#other-operators

そして、これはドキュメントのどこかにある例です

{% set greeting = 'Hello' %}
{% set name = 'Fabien' %}

{{ greeting ~ name|lower }}   {# Hello fabien #}

{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}

22

この場合、プレーンテキストと変数を出力する場合、次のように実行できます。

http://{{ app.request.host }}

いくつかの変数を連結したい場合は、alessandro1997のソリューションがはるかに優れています。


2
これは私にとっては機能しません。別のフィルターで文字列全体をurl_encodeする必要があるためです
stoefln


11

連結された文字列(または基本的な数学演算)でフィルターを使用する必要があるときはいつでも、それを()でラップする必要があります。例えば。:

{{ ('http://' ~ app.request.host) | url_encode }}


1
とても助かります、ありがとう。変換キーとして使用するために変数を連結する必要がありました。
afilina 2014年

6

symfonyではこれをプロトコルとホストに使用できます:

{{ app.request.schemeAndHttpHost }}

@ alessandro1997は連結について完璧な答えを出しましたが。


6

~ように使用できます{{ foo ~ 'inline string' ~ bar.fieldName }}

ただし、独自のconcat関数を作成して、質問のように使用することもできます
{{ concat('http://', app.request.host) }}

src/AppBundle/Twig/AppExtension.php

<?php

namespace AppBundle\Twig;

class AppExtension extends \Twig_Extension
{
    /**
     * {@inheritdoc}
     */
    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('concat', [$this, 'concat'], ['is_safe' => ['html']]),
        ];
    }

    public function concat()
    {
        return implode('', func_get_args())
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'app_extension';
    }
}

app/config/services.yml

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }

非常に良い解決策
ダニエル

3

クイックアンサー(TL; DR)

  • 小枝文字列の連結は、format()フィルターを使用して行うこともできます

詳細な回答

環境

  • 小枝2.x
  • 文字列の構築と連結

問題

  • シナリオ: DeveloperGailSimがTwigで文字列連結を行いたい
    • このスレッドの他の回答はすでにconcat演算子に対応しています
    • この回答は、formatより表現力のあるフィルターに焦点を当てています

解決

  • 別のアプローチはformatフィルターを使用することです
  • formatフィルタは次のように動作しsprintf、他のプログラミング言語の機能
  • formatフィルタは、より複雑な文字列の〜演算子未満面倒かもしれ

Example00

  • example00 string concat bare

    {{"%s%s%s!" | format( 'alpha'、 'bravo'、 'charlie')}}
    
    ---結果-
    
    アルファブラボーチャーリー!
    
    

Example01

  • example01文字列連結、間にテキストあり

    {{"%sの%sは主に%sに該当します!" | format( 'alpha'、 'bravo'、 'charlie')}}
    
    ---結果-
    
    ブラボーのアルファは主にチャーリーに当てはまる!
    
    

Example02

  • example02文字列連結と数値フォーマット
  • sprintf他の言語と同じ構文に従います

    {{"%04dの%04dは主に%s!に該当します!" | format(2,3、 'tree')}}
    
    ---結果-
    
    0003の0002は主に木に落ちます!
    
    

こちらもご覧ください


1

文字列、変数、翻訳を組み合わせるには、次のようにします。

    {% set add_link = '
    <a class="btn btn-xs btn-icon-only" 
       title="' ~ 'string.to_be_translated'|trans ~ '" 
       href="' ~ path('acme_myBundle_link',{'link':link.id})  ~ '">
    </a>
    ' %}

すべてが混同されているにもかかわらず、それは魅力のように機能します。


-1

「{{...}}」区切り文字は文字列内でも使用できます。

"http://{{ app.request.host }}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.