From d4a24180a4287c88a03f831a3375aba9cea0835a Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 24 Mar 2022 09:27:27 +0800 Subject: [PATCH] fix bug --- CHANGELOG.md | 5 +- .../main/java/cn/hutool/http/HtmlUtil.java | 30 +++++----- .../java/cn/hutool/http/HtmlUtilTest.java | 60 ++++++++++++------- 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ba639f2e..edf6011ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.0 (2022-03-22) +# 5.8.0 (2022-03-24) ### ❌不兼容特性 * 【db 】 【不向下兼容 】增加MongoDB4.x支持返回MongoClient变更(pr#568@Gitee) @@ -52,7 +52,8 @@ * 【json 】 修复JSON对Map.Entry的解析问题 * 【core 】 修复MapConverter中map与map转换兼容问题 * 【poi 】 解决sax读取时,POI-5.2.x兼容性问题 -* 【core 】 修复修复判断两段时间区间交集问题(pr#2210@Github) +* 【core 】 修复判断两段时间区间交集问题(pr#2210@Github) +* 【http 】 修复标签误删问题(issue#I4Z7BV@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.7.22 (2022-03-01) diff --git a/hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java b/hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java index bbd8b5343..be915ad2a 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java +++ b/hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java @@ -6,13 +6,13 @@ import cn.hutool.core.util.StrUtil; /** * HTML工具类 - * + * *

* 比如我们在使用爬虫爬取HTML页面后,需要对返回页面的HTML内容做一定处理,
* 比如去掉指定标签(例如广告栏等)、去除JS、去掉样式等等,这些操作都可以使用此工具类完成。 - * + * * @author xiaoleilu - * + * */ public class HtmlUtil { @@ -50,7 +50,7 @@ public class HtmlUtil { *

  • < 替换为 &lt;
  • *
  • > 替换为 &gt;
  • * - * + * * @param text 被转义的文本 * @return 转义后的文本 */ @@ -60,7 +60,7 @@ public class HtmlUtil { /** * 还原被转义的HTML特殊字符 - * + * * @param htmlStr 包含转义符的HTML内容 * @return 转换后的字符串 */ @@ -76,7 +76,7 @@ public class HtmlUtil { /** * 清除所有HTML标签,但是不删除标签内的内容 - * + * * @param content 文本 * @return 清除标签后的文本 */ @@ -87,7 +87,7 @@ public class HtmlUtil { /** * 清除指定HTML标签和被标签包围的内容
    * 不区分大小写 - * + * * @param content 文本 * @param tagNames 要清除的标签 * @return 去除标签后的文本 @@ -99,7 +99,7 @@ public class HtmlUtil { /** * 清除指定HTML标签,不包括内容
    * 不区分大小写 - * + * * @param content 文本 * @param tagNames 要清除的标签 * @return 去除标签后的文本 @@ -111,7 +111,7 @@ public class HtmlUtil { /** * 清除指定HTML标签
    * 不区分大小写 - * + * * @param content 文本 * @param withTagContent 是否去掉被包含在标签中的内容 * @param tagNames 要清除的标签 @@ -127,10 +127,10 @@ public class HtmlUtil { // (?i)表示其后面的表达式忽略大小写 if (withTagContent) { // 标签及其包含内容 - regex = StrUtil.format("(?i)<{}\\s*?[^>]*?/?>(.*?)?", tagName, tagName); + regex = StrUtil.format("(?i)<{}(\\s+[^>]*)?/?>(.*?)?", tagName, tagName); } else { // 标签不包含内容 - regex = StrUtil.format("(?i)<{}\\s*?[^>]*?>|", tagName, tagName); + regex = StrUtil.format("(?i)<{}(\\s+[^>]*)?/?>|", tagName, tagName); } content = ReUtil.delAll(regex, content); // 非自闭标签小写 @@ -140,7 +140,7 @@ public class HtmlUtil { /** * 去除HTML标签中的属性,如果多个标签有相同属性,都去除 - * + * * @param content 文本 * @param attrs 属性名(不区分大小写) * @return 处理后的文本 @@ -161,7 +161,7 @@ public class HtmlUtil { /** * 去除指定标签的所有属性 - * + * * @param content 内容 * @param tagNames 指定标签 * @return 处理后的文本 @@ -177,7 +177,7 @@ public class HtmlUtil { /** * Encoder - * + * * @param text 被编码的文本 * @return 编码后的字符 */ @@ -201,7 +201,7 @@ public class HtmlUtil { /** * 过滤HTML文本,防止XSS攻击 - * + * * @param htmlContent HTML内容 * @return 过滤后的内容 */ diff --git a/hutool-http/src/test/java/cn/hutool/http/HtmlUtilTest.java b/hutool-http/src/test/java/cn/hutool/http/HtmlUtilTest.java index b0fda17ae..214620d5d 100644 --- a/hutool-http/src/test/java/cn/hutool/http/HtmlUtilTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HtmlUtilTest.java @@ -5,111 +5,125 @@ import org.junit.Test; /** * Html单元测试 - * + * * @author looly * */ public class HtmlUtilTest { - + @Test public void removeHtmlTagTest() { //非闭合标签 String str = "pre"; String result = HtmlUtil.removeHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.removeHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.removeHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.removeHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //包含内容标签 str = "pre
    dfdsfdsfdsf
    "; result = HtmlUtil.removeHtmlTag(str, "div"); Assert.assertEquals("pre", result); - + //带换行 str = "pre
    \r\n\t\tdfdsfdsfdsf\r\n
    "; result = HtmlUtil.removeHtmlTag(str, "div"); Assert.assertEquals("pre", result); } - + @Test public void cleanHtmlTagTest() { //非闭合标签 String str = "pre"; String result = HtmlUtil.cleanHtmlTag(str); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.cleanHtmlTag(str); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.cleanHtmlTag(str); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.cleanHtmlTag(str); Assert.assertEquals("pre", result); - + //包含内容标签 str = "pre
    dfdsfdsfdsf
    "; result = HtmlUtil.cleanHtmlTag(str); Assert.assertEquals("predfdsfdsfdsf", result); - + //带换行 str = "pre
    \r\n\t\tdfdsfdsfdsf\r\n
    BBBB
    "; result = HtmlUtil.cleanHtmlTag(str); Assert.assertEquals("pre\r\n\t\tdfdsfdsfdsf\r\nBBBB", result); } - + @Test public void unwrapHtmlTagTest() { //非闭合标签 String str = "pre"; String result = HtmlUtil.unwrapHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.unwrapHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.unwrapHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + //闭合标签 str = "pre"; result = HtmlUtil.unwrapHtmlTag(str, "img"); Assert.assertEquals("pre", result); - + + //闭合标签 + str = "pre"; + result = HtmlUtil.unwrapHtmlTag(str, "img"); + Assert.assertEquals("pre", result); + //包含内容标签 str = "pre
    abc
    "; result = HtmlUtil.unwrapHtmlTag(str, "div"); Assert.assertEquals("preabc", result); - + //带换行 str = "pre
    \r\n\t\tabc\r\n
    "; result = HtmlUtil.unwrapHtmlTag(str, "div"); Assert.assertEquals("pre\r\n\t\tabc\r\n", result); } - + + @Test + public void unwrapTest2() { + // 避免移除i却误删img标签的情况 + String htmlString = "测试文本"; + String tagString = "i,br"; + String cleanTxt = HtmlUtil.removeHtmlTag(htmlString, false, tagString.split(",")); + Assert.assertEquals("测试文本", cleanTxt); + } + @Test public void escapeTest() { String html = "123'123'"; @@ -119,14 +133,14 @@ public class HtmlUtilTest { Assert.assertEquals(html, restoreEscaped); Assert.assertEquals("'", HtmlUtil.unescape("'")); } - + @Test public void filterTest() { String html = ""; String filter = HtmlUtil.filter(html); Assert.assertEquals("", filter); } - + @Test public void removeHtmlAttrTest() { @@ -150,7 +164,7 @@ public class HtmlUtilTest { result = HtmlUtil.removeHtmlAttr(html, "class"); Assert.assertEquals("
    ", result); } - + @Test public void removeAllHtmlAttrTest() { String html = "
    ";