symfony 2 twigはテキストの長さを制限し、3つのドットを入れます


128

どうすればテキストの長さ、たとえば50を制限し、ディスプレイに3つのドットを配置できますか?

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

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

{%endif%}

4
「3つのドット」は、実際には省略記号と呼ばれる1つの文字です。これは3つの完全な停止で...あり、これは省略です
ルークカズンズ

回答:


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

Twig 1.6が必要です


これが答えになるはずですが、今でも機能しています;)
whalesingswee

どのようにして...へのリンクを追加できますか?
mburakergenc 2017

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 2018年

116

小枝の切り捨てまたはワードラップフィルターを使用しないのはなぜですか?それは小枝拡張に属し、libは私が見るようにSymfony2.0の一部です。

{{ text|truncate(50) }}

5
私はSymfony 2.3を使用していますが、切り捨てフィルターはデフォルトの拡張機能の一部ではありません。したがって、代わりにマヌエルの解決策に頼りました。
maurits 2013年

8
Symfonyで拡張機能を有効にするには、これを構成ファイルの1つに追加します:gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
追加するには...、2つ目のパラメータはに設定されなければならないtrueような{{ text|truncate(50, true)
Sithu

実際に2番目のパラメーターをtrueに設定すると、単語全体が保持されます。デフォルトで楕円が追加されます。3番目のパラメーターは、楕円を好きなように変更できます。twig-extensions.readthedocs.io/en/latest/…–
ベータ版

1
Symfony 2.8を使用する場合、この拡張機能をインストールして使用する必要がありました。require twig/extensions
ベータ版

35

もう一つは:

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

7
唯一の問題は、常にドットが表示されることです...:/最初の解決策で行くと思います。
MarkusKottländer2014

1
この[x:x]に関するドキュメントのあるリンクを共有していただけますか?
BENARD Patrick、2015

常に3つの点があるので、実際には質問に答えることはできません。
dmmd

17

これは非常に古い質問ですが、twig 1.6以降ではスライスフィルターを使用できます。

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

チルダの2番目の部分は、省略記号などを追加する場合にオプションです。

編集:私の悪い、私は最も投票された回答がスライスフィルターを利用することを確認します。


10

名前付きUTF-8省略記号を使用した@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テンプレートをインポートし、次のように「ツール」としてインポートします(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 2017

2

以下の方法で制限できます。1つ目は開始インデックスで、2つ目は文字数です。

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

2

制限に達した後、切り捨てフィルターを使用して文字列を切り取ります

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

こんにちは...

2番目のパラメーターをtrueに設定することで、truncateに単語全体を保持するように指示することもできます。最後のWordがセパレータにある場合、truncateはWord全体を印刷します。

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

こんにちは、ハローワールド!

セパレーターを変更する場合は、3番目のパラメーターを希望のセパレーターに設定するだけです。

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

こんにちはW ??


1

Twig 2およびTwig 3の更新。

切り捨てフィルターは使用できません。代わりにu-filterを使用できます

ここに例があります:

{{ '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(出力:「ここに長い文字列...」):

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

使用例#2(出力: "短い文字列!"):

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

0

ここで新しいDrupal 8機能のBu​​gginess *は、私たちが独自に作成するように促しました。

<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

こんにちは。3つのドットを書くと、3つの別々のドットになりますが、「3つのドット」の文字は省略記号と呼ばれます。省略記号htmlエンティティは&#8230;です。
テオアッタリ

そして、なぜその省略記号にユニコード文字を使用しないのですか?
Nico Haase

あなたもそれを使うことができます!このコメントは、そのコメントに対する答えだったstackoverflow.com/a/17118915/5923187が、その動きがあるため、私の評判のロックされていた
テオ・アタリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.