You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Ruby中按两个换行分割文本?RoR文本域分段实现

在Rails中分割文本域内容为指定段落

首先我注意到你提到想匹配两个换行符,但你的原始文本里其实没有换行——它是用. (句号加空格)来分隔各个城市的。所以咱们的思路应该是先把文本拆成单个城市条目,再按每3个一组拼接成段落,最后包裹<p>标签。

下面是具体的实现方案:

1. 在模型中封装格式化方法(推荐)

把逻辑放在模型里能让视图更简洁,也方便复用。假设你的模型叫CityList,对应的字段是content

class CityList < ApplicationRecord
  def formatted_paragraphs
    # 第一步:按". "分割文本,过滤掉可能的空字符串
    city_items = content.split(/\. /).reject(&:empty?)
    # 确保每个条目都以句号结尾(处理原始文本最后一个条目可能不带句号的情况)
    city_items = city_items.map { |item| item.end_with?('.') ? item : "#{item}." }
    # 第二步:每3个条目为一组
    grouped_cities = city_items.each_slice(3).to_a
    # 第三步:每组拼接成字符串,包裹<p>标签后合并所有段落
    grouped_cities.map { |group| "<p>#{group.join(' ')}</p>" }.join(' ')
  end
end

2. 在视图中渲染

调用方法时需要用rawhtml_safe确保HTML标签被正确解析,而不是被转义:

<%= raw @city_list.formatted_paragraphs %>

3. 直接在视图中处理(快速测试用)

如果不想改动模型,也可以直接在视图里写逻辑:

<% 
  raw_content = "Berlin. Rome. London. Paris. Warsaw. New York City."
  city_items = raw_content.split(/\. /).reject(&:empty?).map { |item| item.end_with?('.') ? item : "#{item}." }
  grouped_cities = city_items.each_slice(3).to_a
%>
<%= raw grouped_cities.map { |group| "<p>#{group.join(' ')}</p>" }.join(' ') %>

这样处理后,你的原始文本就会被转换成:
<p>Berlin. Rome. London.</p> <p>Paris. Warsaw. New York City.</p>

补充说明

  • 如果未来文本域可能包含用户手动输入的换行符,可以先把换行符替换成. 再处理:content.gsub(/\n/, '. ')
  • each_slice(3)会自动处理条目数不是3的倍数的情况,比如7个城市会分成3个+4个两组,同样能正确生成段落。

内容的提问来源于stack exchange,提问作者pawciorr

火山引擎 最新活动