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 {
*
< 替换为 <
* > 替换为 >
*
- *
+ *
* @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 = "predfdsfdsfdsf
";
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 = "predfdsfdsfdsf
";
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 = "preabc
";
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 = "";