558

Anyone knows how to concatenate strings in twig? I want to do something like:

{{ concat('http://', app.request.host) }} 

11 Answers 11

1067

This should work fine:

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

To add a filter - like 'trans' - in the same tag use

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

As Adam Elsodaney points out, you can also use string interpolation, this does require double quoted strings:

{{ "http://#{app.request.host}" }} 
Sign up to request clarification or add additional context in comments.

8 Comments

Thanks for you answer. But it appears that | trans filter doesn't work on that (eg: {{ 'test_' ~ name | trans }} won't translate my items. Do you have an idea how to do that? thx!
Yes, you have to create a variable to hold the concatenated string. E.g.: {% set foo = 'http://' ~ app.request.host %}. And then you can do: {{ foo | trans }}.
Translation in one line: {{ ('test_' ~ name) | trans }}
Thank you. So the problem is that filters have higher precedence than the concatenation operator.
This worked for me to concat strings passed into a function as one argument, with filters on the variable and the function token itself: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }} No need for an extra variable.
|
123

Also a little known feature in Twig is string interpolation:

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

1 Comment

Nice feature. Be aware, double-quoted strings only!
35

The operator you are looking for is Tilde (~), like Alessandro said, and here it is in the documentation:

~: Converts all operands into strings and concatenates them. {{ "Hello " ~ name ~ "!" }} would return (assuming name is 'John') Hello John!. – http://twig.symfony.com/doc/templates.html#other-operators

And here is an example somewhere else in the docs:

{% set greeting = 'Hello' %} {% set name = 'Fabien' %} {{ greeting ~ name|lower }} {# Hello fabien #} {# use parenthesis to change precedence #} {{ (greeting ~ name)|lower }} {# hello fabien #} 

Comments

22

In this case, where you want to output plain text and a variable, you could do it like this:

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

If you want to concatenate some variables, alessandro1997's solution would be much better.

1 Comment

this does not work for me, cause i have to url_encode the whole string with another filter...
16
{{ ['foo', 'bar'|capitalize]|join }} 

As you can see this works with filters and functions without needing to use set on a seperate line.

Comments

12

Whenever you need to use a filter with a concatenated string (or a basic math operation) you should wrap it with ()'s. Eg.:

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

1 Comment

Very helpful, thanks. I needed to concatenate variables for use as a translation key.
9

You can use ~ like {{ foo ~ 'inline string' ~ bar.fieldName }}

But you can also create your own concat function to use it like in your question:
{{ concat('http://', app.request.host) }}:

In 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'; } } 

In app/config/services.yml:

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

Comments

6

In Symfony you can use this for protocol and host:

{{ app.request.schemeAndHttpHost }} 

Though @alessandro1997 gave a perfect answer about concatenation.

Comments

5

Quick Answer (TL;DR)

  • Twig string concatenation may also be done with the format() filter

Detailed Answer

Context

  • Twig 2.x
  • String building and concatenation

Problem

  • Scenario: DeveloperGailSim wishes to do string concatenation in Twig
    • Other answers in this thread already address the concat operator
    • This answer focuses on the format filter which is more expressive

Solution

  • Alternative approach is to use the format filter
  • The format filter works like the sprintf function in other programming languages
  • The format filter may be less cumbersome than the ~ operator for more complex strings

Example00

  • example00 string concat bare

     {{ "%s%s%s!"|format('alpha','bravo','charlie') }} --- result -- alphabravocharlie! 

Example01

  • example01 string concat with intervening text

     {{ "The %s in %s falls mainly on the %s!"|format('alpha','bravo','charlie') }} --- result -- The alpha in bravo falls mainly on the charlie! 

Example02

  • example02 string concat with numeric formatting

  • follows the same syntax as sprintf in other languages

     {{ "The %04d in %04d falls mainly on the %s!"|format(2,3,'tree') }} --- result -- The 0002 in 0003 falls mainly on the tree! 

See also

Comments

3

To mix strings, variables and translations I simply do the following:

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

Despite everything being mixed up, it works like a charm.

Comments

-2

The "{{ ... }}"-delimiter can also be used within strings:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.