You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取mailto值并移除HTML标签?Ruby技术方案咨询

提取mailto值并移除所有HTML标签的实现方案

问题场景

给定包含<mailto:邮箱地址|显示文本>格式标签和其他HTML标签的字符串,需要提取出邮箱地址,同时移除所有HTML标签,保留正常文本内容:

  • 示例输入:<mailto:demomail@gmail.com|demomail@gmail.com> helo<p> bye </p>
  • 期望输出:demomail@gmail.com helo bye

之前使用gsub(/<[^>]*>/,'')或ActionView::Base.full_sanitizer.sanitize()的方式会直接删除整个mailto标签,导致丢失邮箱地址,仅得到helo bye,无法满足需求。

解决方案

核心思路是先提取mailto中的邮箱地址,再清理所有HTML标签,最后合并结果,具体实现如下:

方法1:纯Ruby正则实现

html_string = "<mailto:demomail@gmail.com|demomail@gmail.com> helo<p> bye </p>"

# 匹配并提取mailto标签内的邮箱地址
email = html_string.match(/<mailto:([^|>]+)\|[^>]+>/)&.captures&.first

# 移除所有HTML标签
clean_text = html_string.gsub(/<[^>]*>/, '')

# 合并结果(处理邮箱不存在的边界情况)
result = [email, clean_text].compact.join(' ').strip
# 输出结果:"demomail@gmail.com helo bye"

方法2:结合ActionView Sanitizer实现

如果项目中已经依赖ActionView,可以用官方的清理工具配合邮箱提取:

require 'action_view'

html_string = "<mailto:demomail@gmail.com|demomail@gmail.com> helo<p> bye </p>"

# 提取邮箱地址
email = html_string.match(/<mailto:([^|>]+)\|[^>]+>/)&.captures&.first

# 用ActionView清理所有HTML标签
clean_text = ActionView::Base.full_sanitizer.sanitize(html_string)

# 合并结果
result = [email, clean_text].compact.join(' ').strip

正则说明

正则表达式<mailto:([^|>]+)\|[^>]+>的作用:

  • <mailto::匹配mailto标签的起始部分
  • ([^|>]+):捕获邮箱地址(匹配除|和>之外的所有字符,对应邮箱部分)
  • \|[^>]+>:匹配邮箱后的|符号及标签内的显示文本,直到标签结束

如果遇到mailto标签无|分隔的变体(如<mailto:test@example.com>),可以调整正则为<mailto:([^>]+)>即可兼容。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:55:23