如何在树枝中连接字符串


Answers:


872

这应该工作正常:

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

要在同一标签中添加过滤器(如“ trans”)

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

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

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

3
感谢您的回答。但似乎 trans过滤器无法解决该问题(例如:{{'test_'〜name | trans}}无法翻译我的项目。您知道如何执行此操作吗?thx!
guillaumepotier 2012年

12
是的,您必须创建一个变量来保存串联的字符串。例如:{% set foo = 'http://' ~ app.request.host %}。然后您可以执行:{{ foo | trans }}
亚历山德罗·德桑蒂斯

75
一行翻译:{{('test_'〜name)| trans}}
约翰尼(Johnny)

6
谢谢。因此,问题在于过滤器的优先级高于连接运算符。
亚历山德罗·迪桑蒂斯

这对我来说可以将传递给函数的字符串作为一个参数进行连接,并在变量和函数令牌本身上进行过滤:{{ form_open('admin/files/?path='~file_path|urlencode)|raw }}不需要额外的变量。
韦斯利·默奇


26

就像亚历山德罗所说的那样,您要查找的运算符是Tilde(〜),在文档中:

〜:将所有操作数转换为字符串并将它们连接在一起。{{“你好”〜名称〜“!” }}会返回(假设名称为“ 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 2011年


11

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

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


1
非常有帮助,谢谢。我需要连接变量以用作翻译键。
阿菲丽娜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 }

一个很好的解决方案
Daniel

3

快速解答(TL; DR)

  • 小枝字符串串联也可以使用format()过滤器完成

详细答案

语境

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

问题

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

  • 替代方法是使用format过滤器
  • format过滤器的工作方式类似于sprintf在其他编程语言功能
  • format对于更复杂的字符串,该过滤器可能不如〜运算符那么麻烦

范例00

  • example00字符串concat裸

    {{“%s%s%s!” | format('alpha','bravo','charlie')}}
    
    -结果-
    
    alphabravocharlie!
    
    

范例01

  • example01带有中间文本的字符串concat

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

示例02

  • example02具有数字格式的字符串concat
  • 遵循与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 }}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.