【Java用法】Java 过滤html标签获取纯文本信息

简介: 【Java用法】Java 过滤html标签获取纯文本信息

这个功能挺简单的,用正则即可实现,但是有很多优秀的人都做过了,你说咱们还有必要重复造轮子吗?过滤HTML标签,也是为了安全起见,它能有效的放置XSS攻击

方案一、Hutool工具类

cn.hutool.http.HtmlUtil 可以实现Html标签的过滤,有很多方法,具体使用需要自行测试。

package com.soft.practice.javacolume1;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONUtil;
import com.soft.practice.domain.dataobject.MainsiteQuoteDO;
public class HtmlFilterTest {
    public static void main(String[] args) {
        MainsiteQuoteDO mainsiteQuoteDO = new MainsiteQuoteDO();
        mainsiteQuoteDO.setArea("<div><p><span class='width:60px'>这是面积<span/></p></div>");
        mainsiteQuoteDO.setCity("<div class=\"article-content\"><p><span class=\"bjh-p\"感知</span></p><p><span class=\"bjh-p\">【美侦察机前往侦察】");
        mainsiteQuoteDO.setCustomerMessage("\"<div class=\\\"article-content\\\"><p><span class=\\\"bjh-p\\\">\" +\n" +
                "                \"感知</span></p><p><span class=\\\"bjh-p\\\">【美侦察机前往侦察】\"");
        mainsiteQuoteDO.setSearchKey("<div><p><span class='width:60px'>这是面积<span/></p></div>");
        String s = HtmlUtil.cleanHtmlTag(JSONUtil.toJsonStr(mainsiteQuoteDO));
        MainsiteQuoteDO quoteDO = JSONUtil.toBean(s, MainsiteQuoteDO.class);
        System.out.println(quoteDO);
    }
}

方案二、Spring 自带的工具类

org.springframework.web.util.HtmlUtils 可以实现HTML标签及转义字符之间的转换。  这个HtmlUtils里有可多方法,具体如何使用可自行试验。

代码如下:

/** HTML转义 **/  
String s = HtmlUtils.htmlEscape("<div>hello world</div><p>&nbsp;</p>");  
System.out.println(s);  
String s2 = HtmlUtils.htmlUnescape(s);  
System.out.println(s2);  

输出结果:

&lt;div&gt;hello world&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  
<div>hello world</div><p>&nbsp;</p>  

方案三、自己编写正则工具类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * HTML标签过滤工具
 *
 * @author jim
 * @date 2017/11/27
 */
public final class HtmlUtils {
    private static final Logger logger = LoggerFactory.getLogger(HtmlUtils.class);
    /**
     * 禁止实例化
     */
    private HtmlUtils() {
        throw new IllegalStateException("禁止实例化");
    }
    /**
     * 过滤HTML标签输出文本
     *
     * @param inputString 原字符串
     * @return 过滤后字符串
     */
    public static String Html2Text(String inputString) {
        if (StringUtils.isEmpty(inputString)) {
            return "";
        }
        // 含html标签的字符串
        String htmlStr = inputString.trim();
        String textStr = "";
        Pattern p_script;
        Matcher m_script;
        Pattern p_style;
        Matcher m_style;
        Pattern p_html;
        Matcher m_html;
        Pattern p_space;
        Matcher m_space;
        Pattern p_escape;
        Matcher m_escape;
        try {
            // 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
            String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
            // 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
            String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
            // 定义HTML标签的正则表达式
            String regEx_html = "<[^>]+>";
            // 定义空格回车换行符
            String regEx_space = "\\s*|\t|\r|\n";
            // 定义转义字符
            String regEx_escape = "&.{2,6}?;";
            // 过滤script标签
            p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
            m_script = p_script.matcher(htmlStr);
            htmlStr = m_script.replaceAll("");
            // 过滤style标签
            p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
            m_style = p_style.matcher(htmlStr);
            htmlStr = m_style.replaceAll("");
            // 过滤html标签
            p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
            m_html = p_html.matcher(htmlStr);
            htmlStr = m_html.replaceAll("");
            // 过滤空格回车标签
            p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
            m_space = p_space.matcher(htmlStr);
            htmlStr = m_space.replaceAll("");
            // 过滤转义字符
            p_escape = Pattern.compile(regEx_escape, Pattern.CASE_INSENSITIVE);
            m_escape = p_escape.matcher(htmlStr);
            htmlStr = m_escape.replaceAll("");
            textStr = htmlStr;
        } catch (Exception e) {
            logger.info("Html2Text:{}", e.getMessage());
        }
        // 返回文本字符串
        return textStr;
    }
}

完结!

相关文章
|
3月前
|
移动开发 前端开发 JavaScript
HTML 框架高阶用法
HTML框架,或前端框架,如Bootstrap、Vue.js等,显著提升了Web应用开发的速度与用户体验。本文介绍了一些高级技巧,如自定义样式与组件、响应式设计实践、JavaScript功能增强及性能优化策略等,帮助开发者更好地利用这些工具,实现高效开发并提升应用性能与灵活性。
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
124 5
|
4天前
|
移动开发 前端开发 JavaScript
HTML(HyperText Markup Language,超文本标记语言)
HTML(HyperText Markup Language,超文本标记语言)
38 11
|
20天前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
34 8
|
1月前
利用html2canvas插件自定义生成名片信息并保存图片
这是一个利用html2canvas插件自定义生成名片信息并保存图片,自定义上传头像,自定义输入个人信息内容,自定义图片名称,并将生成的图片保存到本地
37 1
利用html2canvas插件自定义生成名片信息并保存图片
|
1月前
html基本用法
HTML(超文本标记语言)是用于创建网页的标记语言。它通过标签定义文档结构,如文档类型、根元素、元数据和内容。常用标签包括段落、图像、分区、文本格式化、超链接和列表等。例如,使用 `&lt;p&gt;` 标签创建段落,`&lt;img&gt;` 插入图像,`&lt;a&gt;` 创建链接,`&lt;ul&gt;` 和 `&lt;ol&gt;` 分别创建无序和有序列表。
47 16
|
1月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
37 3
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
53 2
|
1月前
|
XML JavaScript 前端开发
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,
|
2月前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。