심포니 2 나뭇 가지가 텍스트의 길이를 제한하고 세 개의 점을 넣습니다.


128

텍스트 길이 (예 : 50)를 어떻게 제한하고 디스플레이에 3 개의 점을 넣을 수 있습니까?

{% if myentity.text|length > 50 %}

{% block td_text %} {{ myentity.text}}{% endblock %}

{%endif%}

4
"세 개의 점"은 실제로 줄임표라고하는 단일 문자입니다. 이것은 세 정거장 ...이며 이것은 줄임표입니다
Luke Cousins

답변:


204
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

당신은 나뭇 가지 1.6 필요


이것은 여전히 지금까지 작업 대답해야한다)
whalesingswee

링크를 어떻게 추가 할 수 있습니까?
mburakergenc

11
또한 단어를 자르려면 다음과 같이 할 수 있습니다 {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. 또한 3 개의 실제 점 ( ...) 대신 줄임표 문자 ( )를 사용하는 것이 좋습니다.
Nemo64

2
더 짧은 :{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn

1
@ Nemo64 당신은 |length처음부터 그냥 빠졌지 만 text완벽합니다. 감사합니다!
mtefi

116

왜 나뭇 가지 자르기 또는 워드 랩 필터를 사용하지 않습니까? 그것은 나뭇 가지 확장에 속하며 lib는 내가 본 것처럼 Symfony2.0의 일부입니다.

{{ text|truncate(50) }}

5
Symfony 2.3을 사용하고 있으며 잘림 필터는 기본 확장의 일부가 아닙니다. 따라서 대신 Manuel의 솔루션에 의지했습니다.
maurits

8
Symfony에서 확장 기능을 활성화하려면 다음을 구성 파일 중 하나에 추가하십시오. gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
추가하려면 ...두 번째 매개 변수를 다음 true과 같이 설정해야합니다.{{ text|truncate(50, true)
Sithu

실제로 두 번째 매개 변수를 true로 설정하면 전체 단어가 유지됩니다. 기본적으로 생략 부호를 추가합니다. 세 번째 매개 변수는 생략 부호를 원하는 것으로 변경할 수 있습니다. twig-extensions.readthedocs.io/en/latest/…
베타

1
Symfony 2.8을 사용하려면이 확장을 설치하여 사용해야했습니다. require twig/extensions
베타

35

다른 하나는 다음과 같습니다.

{{ myentity.text[:50] ~ '...' }}

7
유일한 문제는 항상 점을 표시한다는 것입니다.
Markus Kottländer

1
이 [x : x] 관련 문서가있는 링크를 공유 할 수 있습니까?
BENARD Patrick

항상 거기에 세 개의 점이 있습니다 ... 질문에 실제로 대답하지 않습니다.
dmmd

17

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 나뭇 가지 1.6에서 슬라이스 필터를 사용할 수 있습니다.

{{ myentity.text|slice(0, 50) ~ '...' }}

줄임표의 두 번째 부분은 줄임표와 같은 것을 추가하려는 경우 선택 사항입니다.

편집 : 내 나쁜, 나는 가장 많이 투표 된 답변이 슬라이스 필터를 사용한다는 것을 알았습니다.


10

UTF-8 Elipsis라는 @olegkhuss 솔루션 : {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
이 솔루션은 text변수를 통한 HTML 삽입을 가능하게 합니다.
emix

1
@ michael-zukowski 당신 말이 맞아요. 솔루션을 변경했습니다.
Matthias Schobner

8

@mshobnr / @olegkhuss 솔루션은 간단한 매크로로 만들어졌습니다.

{% macro trunc(txt, len) -%}
    {{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}

사용 예 :

{{ tools.trunc('This is the text to truncate. ', 50) }}

Nb 매크로가 들어있는 Twig 템플릿을 가져 와서 다음과 같이 'tools'로 가져옵니다 (Symfony).

{% import "@AppBundle/tools.html.twig" as tools -%}

또한 html 문자 코드를 실제 문자로 바 꾸었습니다. UTF-8을 파일 인코딩으로 사용할 때 문제가되지 않습니다. 이렇게 |raw하면 보안 문제가 발생할 수 있으므로 사용할 필요가 없습니다 .


6

더 우아한 해결책은 텍스트를 단어 수로 제한하는 것입니다 (문자 수가 아닌). 이렇게하면 못생긴 찢어짐을 방지 할 수 있습니다 (예 : 'Stackov ...').

다음은 10 단어보다 긴 텍스트 블록 만 줄이는 예제입니다.

{% set text = myentity.text |split(' ') %} 

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

추가 기능이 필요하지 않습니다 !!! 그냥 필요한 것, 단어로 공간과 조각으로 나눕니다, thx !!!
Vladimir Ch

매력처럼 작동
VDarricau

2

다음과 같은 방법으로 제한 할 수 있습니다. 첫 번째는 시작 색인이고 두 번째는 문자 수입니다.

**{{ results['text'][4:2] }}**

2

한계에 도달 한 후 자르기 필터를 사용하여 문자열 잘라 내기

{{ "Hello World!"|truncate(5) }} // default separator is ...

여보세요...

두 번째 매개 변수를 true로 설정하여 전체 단어를 유지하도록 자르라고 지시 할 수도 있습니다. 마지막 단어가 구분 기호에 있으면 자르면 전체 단어가 인쇄됩니다.

 {{ "Hello World!"|truncate(7, true) }} // preserve words

여보세요 세계!

구분 기호를 변경하려면 세 번째 매개 변수를 원하는 구분 기호로 설정하십시오.

{{ "Hello World!"|truncate(7, false, "??") }} 

안녕 W ??


1

나뭇 가지 2와 나뭇 가지 3에 대한 업데이트.

자르기 필터를 사용할 수 없습니다. 대신 사용할 수 있습니다. u 필터를

다음은 예입니다.

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

참고 :이 필터는 필요한 StringExtension의 일부입니다.

twig/string-extra

0

나는이 목적을 위해이 간단한 마르코를 썼다.

{%- macro stringMaxLength(str, maxLength) -%}
    {%- if str | length < maxLength -%}
        {{ str }}
    {%- else -%}
        {{ str|slice(0, maxLength) }}...
    {%- endif -%}
{%- endmacro -%}

사용법 예 # 1 (출력 : "my long string here ...") :

{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}

사용 예 # 2 (출력 : "shorter string!") :

{{ _self.stringMaxLength("shorter string!", 20) }}

0

새로운 Drupal 8 기능의 버그 *는 다음과 같이 작성했습니다.

<a href="{{ view_node }}">{% if title|length > 32 %}{% set title_array = title|split(' ') %}{% set title_word_count = 0 %}{% for ta in title_array %}{% set word_count = ta|length %}{% if title_word_count < 32 %}{% set title_word_count = title_word_count + word_count %}{{ ta }} {% endif %}{% endfor %}...{% else %}{{ title }}{% endif %}</a>

이것은 단어와 문자를 모두 고려합니다 (* D8의 "단어 경계"설정은 아무 것도 표시하지 않았습니다).


-1

HTML 문자를 사용하는 것이 좋습니다

{{ entity.text[:50] }}&#8230;

답변에 설명을 추가 할 수 있습니까? 왜 HTML 엔터티를 사용해야합니까? 텍스트 길이가 50 자 미만인 경우에도 왜 모든 경우에 텍스트에 추가합니까?
Nico Haase 2018 년

안녕하세요, 세 개의 점을 쓰면 세 개의 개별 점이지만 "세 개의 점"문자를 줄임표라고합니다. 줄임표 html 엔터티는 &#8230;입니다.
Théo Attali

그 줄임표에 유니 코드 문자를 사용하지 않는 이유는 무엇입니까?
Nico Haase

당신도 그것을 사용할 수 있습니다! 이 의견은 해당 댓글에 대한 답변이었습니다. stackoverflow.com/a/17118915/5923187 그러나 저의 명성으로 인해 그 움직임이 잠겼습니다
Théo Attali
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.