514

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

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

11 回答 11

976

这应该可以正常工作:

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

要在同一个标​​签中添加过滤器 - 例如“trans” - 请使用

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

正如Adam Elsodaney 指出的那样,您还可以使用字符串插值,这确实需要双引号字符串:

{{ "http://#{app.request.host}" }}
于 2011-10-09T16:33:07.453 回答
105

Twig 中还有一个鲜为人知的特性是字符串插值

{{ "http://#{app.request.host}" }}
于 2014-07-11T08:44:15.850 回答
29

您正在寻找的运算符是波浪号 (~),就像 Alessandro 所说的那样,它在文档中:

~:将所有操作数转换为字符串并将它们连接起来。{{“你好”~名字~“!” }} 会返回(假设名字是 '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 #}
于 2014-02-01T13:30:27.473 回答
22

在这种情况下,您想要输出纯文本和变量,您可以这样做:

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

如果你想连接一些变量,alessandro1997 的解决方案会好很多。

于 2011-10-09T17:49:27.870 回答
16
{{ ['foo', 'bar'|capitalize]|join }}

如您所见,这适用于过滤器和函数,而无需set在单独的行上使用。

于 2012-06-11T12:15:46.797 回答
11

每当您需要使用带有串联字符串(或基本数学运算)的过滤器时,您应该用 () 将其包装起来。例如。:

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

于 2013-07-28T17:53:05.120 回答
8

你可以使用~喜欢{{ 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 }
于 2015-11-10T22:58:49.200 回答
6

在 Symfony 中,您可以将其用于协议和主机:

{{ app.request.schemeAndHttpHost }}

尽管@alessandro1997 给出了关于连接的完美答案。

于 2013-05-07T16:26:41.883 回答
5

快速回答 (TL;DR)

  • 也可以使用format()过滤器完成 Twig 字符串连接

详细解答

语境

  • 树枝 2.x
  • 字符串构建和连接

问题

  • 场景: DeveloperGailSim 希望在 Twig 中进行字符串连接
    • 该线程中的其他答案已经解决了 concat 运算符
    • 这个答案侧重于format更具表现力的过滤器

解决方案

  • 另一种方法是使用format过滤器
  • format过滤器的工作方式与其他编程语言中的函数sprintf类似
  • 对于更复杂的字符串,format过滤器可能不如 ~ 运算符那么麻烦

示例00

  • example00 字符串 concat 裸露

    {{ "%s%s%s!"|format('alpha','bravo','charlie') }}
    
    - - 结果  - 
    
    阿尔法布拉沃查利!
    
    

Example01

  • example01 字符串连接与中间文本

    {{ "%s 中的 %s 主要落在 %s 上!"|format('alpha','bravo','charlie') }}
    
    - - 结果  - 
    
    Bravo中的阿尔法主要落在查理身上!
    
    

Example02

  • example02 带有数字格式的字符串连接
  • sprintf遵循与其他语言相同的语法

    {{ "%04d 中的 %04d 主要落在 %s 上!"|format(2,3,'tree') }}
    
    - - 结果  - 
    
    0003中的0002主要落在树上!
    
    

也可以看看

于 2017-03-10T21:19:29.120 回答
3

要混合字符串、变量和翻译,我只需执行以下操作:

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

尽管一切都混在一起,但它就像一个魅力。

于 2014-01-10T15:40:48.533 回答
-1

"{{ ... }}" 分隔符也可以在字符串中使用:

"http://{{ app.request.host }}"
于 2015-07-14T09:07:40.693 回答