объединение изображения src с content.field_value в twig [duplicate]

Хотя ответы, которые вы не можете проанализировать HTML с регулярными выражениями, верны, они не применяются здесь. OP просто хочет проанализировать один тег HTML с регулярными выражениями, и это то, что можно сделать с помощью регулярного выражения.

Предлагаемое регулярное выражение неверно:

<([a-z]+) *[^/]*?>

Если вы добавите что-то в регулярное выражение, путем обратного отслеживания его можно заставить сопоставить такие глупые вещи, как <a >>, [^/] слишком разрешительно. Также обратите внимание, что <space>*[^/]* является избыточным, поскольку [^/]* также может соответствовать пробелам.

Мое предложение было бы

<([a-z]+)[^>]*(?<!/)>

Где (?<! ... ) (в Perl-регулярных выражениях) отрицательный внешний вид. Он читает «a», затем слово, а затем все, что не является>, последнее из которых не может быть /, а затем> «.

Обратите внимание, что это позволяет такие вещи, как <a/ > ( как и исходное регулярное выражение), поэтому, если вы хотите что-то более ограничительное, вам нужно создать регулярное выражение для соответствия парам атрибутов, разделенных пробелами.

351
задан dreftymac 7 February 2017 в 00:36
поделиться

11 ответов

Это должно работать нормально:

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

Чтобы добавить фильтр, подобный «trans», в том же теге используйте

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

Как указывает Адам Элсодани, вы также может использовать интерполяцию строк, для этого требуются строки с двойными кавычками:

{{ "http://#{app.request.host}" }}
702
ответ дан Community 15 August 2018 в 12:44
поделиться
  • 1
    Спасибо за ответ. Но, похоже, что | trans filter не работает над этим (например: {{'test_' ~ name | trans}} не переводит мои объекты. У вас есть идея, как это сделать? thx! – guillaumepotier 8 January 2012 в 16:21
  • 2
    Да, вы должны создать переменную для хранения конкатенированной строки. Например: {% set foo = 'http://' ~ app.request.host %}. И тогда вы можете сделать: {{ foo | trans }}. – Alessandro Desantis 8 January 2012 в 19:58
  • 3
    Thanx так много !! :) – guillaumepotier 9 January 2012 в 12:31
  • 4
    Перевод в одной строке: {{('test_' ~ name) | trans}} – Johnny 4 March 2012 в 12:11
  • 5
    Спасибо. Поэтому проблема заключается в том, что фильтры имеют более высокий приоритет, чем оператор конкатенации. – Alessandro Desantis 4 March 2012 в 16:31

Также малоизвестной особенностью Twig является строковая интерполяция:

{{ "http://#{app.request.host}" }}
70
ответ дан Adam Elsodaney 15 August 2018 в 12:44
поделиться
  • 1
    Хорошая функция. Имейте в виду, только строки с двойными кавычками! – bzeaman 18 November 2014 в 10:15
  • 2
    Хороший отзыв, thx. Два года спорадического развития Twig, и я этого не знал. – Blackbam 1 March 2018 в 17:12

В этом случае, когда вы хотите вывести простой текст и переменную, вы можете сделать это следующим образом:

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

Если вы хотите объединить некоторые переменные, решение alessandro1997 будет намного лучше.

21
ответ дан alghimo 15 August 2018 в 12:44
поделиться
  • 1
    это не работает для меня, потому что я должен url_encode всю строку с другим фильтром ... – stoefln 10 October 2011 в 09:03

Быстрый ответ (TL; DR)

  • Конкатенация строки Twig также может быть выполнена с фильтром format()

Подробный ответ

Контекст

  • Twig 2.x
  • Строковое построение и конкатенация

Проблема

  • Сценарий: DeveloperGailSim хочет выполнить конкатенацию строк в Twig. Другие ответы в этом потоке уже адресованы оператору concat. Этот ответ посвящен фильтру format, который более выразителен

Решение

  • Альтернативный подход заключается в использовании фильтра format
  • Фильтр format работает как функция sprintf на других языках программирования
  • format фильтр может быть менее громоздким, чем оператор более сложных строк

Example00

  • example00 string concat bare
    
    {{ "%s%s%s!"|format('alpha','bravo','charlie') }}
    
    --- result --
    
    alphabravocharlie!
    
    

Example01

  • example01 строка concat с промежуточным текстом
    
    {{ "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 строка concat с числовыми форматирование
  • следует тому же синтаксису, что и sprintf в других языках
    
    {{ "The %04d in %04d falls mainly on the %s!"|format(2,3,'tree') }}
    
    --- result --
    
    The 0002 in 0003 falls mainly on the tree!
    
    

См. также

0
ответ дан dreftymac 15 August 2018 в 12:44
поделиться

Чтобы смешать строки, переменные и переводы, я просто делаю следующее:

{% 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
ответ дан Gingi 15 August 2018 в 12:44
поделиться

Всякий раз, когда вам нужно использовать фильтр с конкатенированной строкой (или базовой математической операцией), вы должны обернуть ее с помощью (). Eg.:

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

10
ответ дан lsouza 15 August 2018 в 12:44
поделиться
  • 1
    Очень полезно, спасибо. Мне нужно было объединить переменные для использования в качестве ключа трансляции. – afilina 15 January 2014 в 20:44

Вы можете использовать ~, например {{ 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 }
4
ответ дан luchaninov 15 August 2018 в 12:44
поделиться

В Symfony вы можете использовать это для протокола и хоста:

{{ app.request.schemeAndHttpHost }}

Хотя @ alessandro1997 дал прекрасный ответ о конкатенации.

6
ответ дан Minras 15 August 2018 в 12:44
поделиться

Оператор, которого вы ищете, это Tilde (~), как сказал Алессандро, и здесь он находится в документации:

~: Преобразует все операнды в строки и объединяет их. {{"Hello" ~ name ~ "!" }} вернется (при условии, что имя «Джон») Hello John !. & Ndash; 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 #}
19
ответ дан Nabil Kadimi 15 August 2018 в 12:44
поделиться
{{ ['foo', 'bar'|capitalize]|join }}

Как вы можете видеть, это работает с фильтрами и функциями без необходимости использовать set на отдельной строке.

11
ответ дан Simon Epskamp 15 August 2018 в 12:44
поделиться

Разделитель «{{...}}" может также использоваться в строках:

"http://{{ app.request.host }}"
-1
ответ дан user2345998 15 August 2018 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: