Câu trả lời:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Bạn cần Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. Tôi cũng khuyên bạn nên sử dụng ký tự dấu chấm lửng ( …
) thay vì 3 dấu chấm thực ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
cái đầu tiên text
nhưng thật hoàn hảo, cảm ơn bạn!
Tại sao không sử dụng bộ lọc cắt xén hoặc wordwrap của twig? Nó thuộc về phần mở rộng twig và lib là một phần của Symfony2.0 như tôi thấy.
{{ text|truncate(50) }}
...
, tham số thứ hai nên được đặt true
như{{ text|truncate(50, true)
require twig/extensions
Một số khác là:
{{ myentity.text[:50] ~ '...' }}
Tôi biết đây là một câu hỏi rất cũ, nhưng từ twig 1.6, bạn có thể sử dụng bộ lọc lát;
{{ myentity.text|slice(0, 50) ~ '...' }}
Phần thứ hai từ dấu ngã là tùy chọn nếu bạn muốn thêm một cái gì đó, ví dụ như dấu chấm lửng.
Chỉnh sửa: Xấu của tôi, tôi thấy câu trả lời được bình chọn nhiều nhất sử dụng bộ lọc lát.
Giải pháp @olegkhuss có tên là UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
biến.
@mshobnr / @olegkhuss giải pháp được tạo thành một macro đơn giản:
{% macro trunc(txt, len) -%}
{{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
Ví dụ sử dụng:
{{ tools.trunc('This is the text to truncate. ', 50) }}
Nb Tôi nhập mẫu Twig chứa macro và nhập dưới dạng 'công cụ' như thế này (Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
Ngoài ra, tôi đã thay thế mã ký tự html bằng ký tự thực tế, điều này sẽ không có vấn đề gì khi sử dụng UTF-8 làm mã hóa tệp. Bằng cách này, bạn không phải sử dụng |raw
(vì nó có thể gây ra sự cố bảo mật).
Một giải pháp thậm chí thanh lịch hơn là giới hạn văn bản theo số lượng từ (chứ không phải theo số lượng ký tự). Điều này ngăn chặn những vết rách xấu xí (ví dụ 'Stackov ...').
Đây là một ví dụ trong đó tôi chỉ rút ngắn các khối văn bản dài hơn 10 từ:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
Bạn có thể giới hạn theo cách sau. Đầu tiên là chỉ số bắt đầu và thứ hai là số lượng ký tự.
**{{ results['text'][4:2] }}**
Sử dụng bộ lọc cắt ngắn để cắt một chuỗi sau khi đạt đến giới hạn
{{ "Hello World!"|truncate(5) }} // default separator is ...
Xin chào...
Bạn cũng có thể yêu cầu cắt ngắn để bảo toàn toàn bộ từ bằng cách đặt tham số thứ hai thành true. Nếu từ cuối cùng nằm trên dấu phân cách, cắt ngắn sẽ in ra toàn bộ Word.
{{ "Hello World!"|truncate(7, true) }} // preserve words
Xin chào thế giới!
Nếu bạn muốn thay đổi dấu phân cách, chỉ cần đặt tham số thứ ba thành dấu phân cách bạn muốn.
{{ "Hello World!"|truncate(7, false, "??") }}
Xin chào
Cập nhật cho Twig 2 và Twig 3.
Bộ lọc cắt ngắn không có sẵn, thay vào đó, bạn có thể sử dụng bộ lọc u
đây là một ví dụ:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
Lưu ý: bộ lọc này là một phần của StringExtension có thể được yêu cầu bởi
twig/string-extra
Tôi đã viết marco đơn giản này cho cùng một mục đích, hy vọng nó sẽ giúp:
{%- macro stringMaxLength(str, maxLength) -%}
{%- if str | length < maxLength -%}
{{ str }}
{%- else -%}
{{ str|slice(0, maxLength) }}...
{%- endif -%}
{%- endmacro -%}
Ví dụ sử dụng # 1 (Kết quả: "chuỗi dài của tôi ở đây ..."):
{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}
Ví dụ sử dụng # 2 (Đầu ra: "chuỗi ngắn hơn!"):
{{ _self.stringMaxLength("shorter string!", 20) }}
Bugginess * trong các khả năng mới của Drupal 8 ở đây đã truyền cảm hứng cho chúng tôi tự viết:
<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>
Điều này sẽ được xem xét cả từ và ký tự (* cài đặt "ranh giới từ" trong D8 không hiển thị gì).
Tốt hơn là sử dụng một ký tự HTML
{{ entity.text[:50] }}…
…
.
...
và đây là một Ellipsis…