如何提取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
相关产品推荐
相关产品推荐

