This commit is contained in:
Looly 2022-03-24 09:27:27 +08:00
parent f6feaeb2cd
commit d4a24180a4
3 changed files with 55 additions and 40 deletions

View File

@ -2,7 +2,7 @@
# 🚀Changelog # 🚀Changelog
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.0 (2022-03-22) # 5.8.0 (2022-03-24)
### ❌不兼容特性 ### ❌不兼容特性
* 【db 】 【不向下兼容 】增加MongoDB4.x支持返回MongoClient变更pr#568@Gitee * 【db 】 【不向下兼容 】增加MongoDB4.x支持返回MongoClient变更pr#568@Gitee
@ -52,7 +52,8 @@
* 【json 】 修复JSON对Map.Entry的解析问题 * 【json 】 修复JSON对Map.Entry的解析问题
* 【core 】 修复MapConverter中map与map转换兼容问题 * 【core 】 修复MapConverter中map与map转换兼容问题
* 【poi 】 解决sax读取时POI-5.2.x兼容性问题 * 【poi 】 解决sax读取时POI-5.2.x兼容性问题
* 【core 】 修复修复判断两段时间区间交集问题pr#2210@Github * 【core 】 修复判断两段时间区间交集问题pr#2210@Github
* 【http 】 修复标签误删问题issue#I4Z7BV@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.7.22 (2022-03-01) # 5.7.22 (2022-03-01)

View File

@ -6,13 +6,13 @@ import cn.hutool.core.util.StrUtil;
/** /**
* HTML工具类 * HTML工具类
* *
* <p> * <p>
* 比如我们在使用爬虫爬取HTML页面后需要对返回页面的HTML内容做一定处理<br> * 比如我们在使用爬虫爬取HTML页面后需要对返回页面的HTML内容做一定处理<br>
* 比如去掉指定标签例如广告栏等去除JS去掉样式等等这些操作都可以使用此工具类完成 * 比如去掉指定标签例如广告栏等去除JS去掉样式等等这些操作都可以使用此工具类完成
* *
* @author xiaoleilu * @author xiaoleilu
* *
*/ */
public class HtmlUtil { public class HtmlUtil {
@ -50,7 +50,7 @@ public class HtmlUtil {
* <li>&lt; 替换为 &amp;lt;</li> * <li>&lt; 替换为 &amp;lt;</li>
* <li>&gt; 替换为 &amp;gt;</li> * <li>&gt; 替换为 &amp;gt;</li>
* </ul> * </ul>
* *
* @param text 被转义的文本 * @param text 被转义的文本
* @return 转义后的文本 * @return 转义后的文本
*/ */
@ -60,7 +60,7 @@ public class HtmlUtil {
/** /**
* 还原被转义的HTML特殊字符 * 还原被转义的HTML特殊字符
* *
* @param htmlStr 包含转义符的HTML内容 * @param htmlStr 包含转义符的HTML内容
* @return 转换后的字符串 * @return 转换后的字符串
*/ */
@ -76,7 +76,7 @@ public class HtmlUtil {
/** /**
* 清除所有HTML标签但是不删除标签内的内容 * 清除所有HTML标签但是不删除标签内的内容
* *
* @param content 文本 * @param content 文本
* @return 清除标签后的文本 * @return 清除标签后的文本
*/ */
@ -87,7 +87,7 @@ public class HtmlUtil {
/** /**
* 清除指定HTML标签和被标签包围的内容<br> * 清除指定HTML标签和被标签包围的内容<br>
* 不区分大小写 * 不区分大小写
* *
* @param content 文本 * @param content 文本
* @param tagNames 要清除的标签 * @param tagNames 要清除的标签
* @return 去除标签后的文本 * @return 去除标签后的文本
@ -99,7 +99,7 @@ public class HtmlUtil {
/** /**
* 清除指定HTML标签不包括内容<br> * 清除指定HTML标签不包括内容<br>
* 不区分大小写 * 不区分大小写
* *
* @param content 文本 * @param content 文本
* @param tagNames 要清除的标签 * @param tagNames 要清除的标签
* @return 去除标签后的文本 * @return 去除标签后的文本
@ -111,7 +111,7 @@ public class HtmlUtil {
/** /**
* 清除指定HTML标签<br> * 清除指定HTML标签<br>
* 不区分大小写 * 不区分大小写
* *
* @param content 文本 * @param content 文本
* @param withTagContent 是否去掉被包含在标签中的内容 * @param withTagContent 是否去掉被包含在标签中的内容
* @param tagNames 要清除的标签 * @param tagNames 要清除的标签
@ -127,10 +127,10 @@ public class HtmlUtil {
// (?i)表示其后面的表达式忽略大小写 // (?i)表示其后面的表达式忽略大小写
if (withTagContent) { if (withTagContent) {
// 标签及其包含内容 // 标签及其包含内容
regex = StrUtil.format("(?i)<{}\\s*?[^>]*?/?>(.*?</{}>)?", tagName, tagName); regex = StrUtil.format("(?i)<{}(\\s+[^>]*)?/?>(.*?</{}>)?", tagName, tagName);
} else { } else {
// 标签不包含内容 // 标签不包含内容
regex = StrUtil.format("(?i)<{}\\s*?[^>]*?>|</{}>", tagName, tagName); regex = StrUtil.format("(?i)<{}(\\s+[^>]*)?/?>|</?{}>", tagName, tagName);
} }
content = ReUtil.delAll(regex, content); // 非自闭标签小写 content = ReUtil.delAll(regex, content); // 非自闭标签小写
@ -140,7 +140,7 @@ public class HtmlUtil {
/** /**
* 去除HTML标签中的属性如果多个标签有相同属性都去除 * 去除HTML标签中的属性如果多个标签有相同属性都去除
* *
* @param content 文本 * @param content 文本
* @param attrs 属性名不区分大小写 * @param attrs 属性名不区分大小写
* @return 处理后的文本 * @return 处理后的文本
@ -161,7 +161,7 @@ public class HtmlUtil {
/** /**
* 去除指定标签的所有属性 * 去除指定标签的所有属性
* *
* @param content 内容 * @param content 内容
* @param tagNames 指定标签 * @param tagNames 指定标签
* @return 处理后的文本 * @return 处理后的文本
@ -177,7 +177,7 @@ public class HtmlUtil {
/** /**
* Encoder * Encoder
* *
* @param text 被编码的文本 * @param text 被编码的文本
* @return 编码后的字符 * @return 编码后的字符
*/ */
@ -201,7 +201,7 @@ public class HtmlUtil {
/** /**
* 过滤HTML文本防止XSS攻击 * 过滤HTML文本防止XSS攻击
* *
* @param htmlContent HTML内容 * @param htmlContent HTML内容
* @return 过滤后的内容 * @return 过滤后的内容
*/ */

View File

@ -5,111 +5,125 @@ import org.junit.Test;
/** /**
* Html单元测试 * Html单元测试
* *
* @author looly * @author looly
* *
*/ */
public class HtmlUtilTest { public class HtmlUtilTest {
@Test @Test
public void removeHtmlTagTest() { public void removeHtmlTagTest() {
//非闭合标签 //非闭合标签
String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">"; String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">";
String result = HtmlUtil.removeHtmlTag(str, "img"); String result = HtmlUtil.removeHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img>"; str = "pre<img>";
result = HtmlUtil.removeHtmlTag(str, "img"); result = HtmlUtil.removeHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img src=\"xxx/dfdsfds/test.jpg\" />"; str = "pre<img src=\"xxx/dfdsfds/test.jpg\" />";
result = HtmlUtil.removeHtmlTag(str, "img"); result = HtmlUtil.removeHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img />"; str = "pre<img />";
result = HtmlUtil.removeHtmlTag(str, "img"); result = HtmlUtil.removeHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//包含内容标签 //包含内容标签
str = "pre<div class=\"test_div\">dfdsfdsfdsf</div>"; str = "pre<div class=\"test_div\">dfdsfdsfdsf</div>";
result = HtmlUtil.removeHtmlTag(str, "div"); result = HtmlUtil.removeHtmlTag(str, "div");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//带换行 //带换行
str = "pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div>"; str = "pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div>";
result = HtmlUtil.removeHtmlTag(str, "div"); result = HtmlUtil.removeHtmlTag(str, "div");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
} }
@Test @Test
public void cleanHtmlTagTest() { public void cleanHtmlTagTest() {
//非闭合标签 //非闭合标签
String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">"; String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">";
String result = HtmlUtil.cleanHtmlTag(str); String result = HtmlUtil.cleanHtmlTag(str);
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img>"; str = "pre<img>";
result = HtmlUtil.cleanHtmlTag(str); result = HtmlUtil.cleanHtmlTag(str);
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img src=\"xxx/dfdsfds/test.jpg\" />"; str = "pre<img src=\"xxx/dfdsfds/test.jpg\" />";
result = HtmlUtil.cleanHtmlTag(str); result = HtmlUtil.cleanHtmlTag(str);
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img />"; str = "pre<img />";
result = HtmlUtil.cleanHtmlTag(str); result = HtmlUtil.cleanHtmlTag(str);
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//包含内容标签 //包含内容标签
str = "pre<div class=\"test_div\">dfdsfdsfdsf</div>"; str = "pre<div class=\"test_div\">dfdsfdsfdsf</div>";
result = HtmlUtil.cleanHtmlTag(str); result = HtmlUtil.cleanHtmlTag(str);
Assert.assertEquals("predfdsfdsfdsf", result); Assert.assertEquals("predfdsfdsfdsf", result);
//带换行 //带换行
str = "pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div><div class=\"test_div\">BBBB</div>"; str = "pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div><div class=\"test_div\">BBBB</div>";
result = HtmlUtil.cleanHtmlTag(str); result = HtmlUtil.cleanHtmlTag(str);
Assert.assertEquals("pre\r\n\t\tdfdsfdsfdsf\r\nBBBB", result); Assert.assertEquals("pre\r\n\t\tdfdsfdsfdsf\r\nBBBB", result);
} }
@Test @Test
public void unwrapHtmlTagTest() { public void unwrapHtmlTagTest() {
//非闭合标签 //非闭合标签
String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">"; String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">";
String result = HtmlUtil.unwrapHtmlTag(str, "img"); String result = HtmlUtil.unwrapHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img>"; str = "pre<img>";
result = HtmlUtil.unwrapHtmlTag(str, "img"); result = HtmlUtil.unwrapHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img src=\"xxx/dfdsfds/test.jpg\" />"; str = "pre<img src=\"xxx/dfdsfds/test.jpg\" />";
result = HtmlUtil.unwrapHtmlTag(str, "img"); result = HtmlUtil.unwrapHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签 //闭合标签
str = "pre<img />"; str = "pre<img />";
result = HtmlUtil.unwrapHtmlTag(str, "img"); result = HtmlUtil.unwrapHtmlTag(str, "img");
Assert.assertEquals("pre", result); Assert.assertEquals("pre", result);
//闭合标签
str = "pre<img/>";
result = HtmlUtil.unwrapHtmlTag(str, "img");
Assert.assertEquals("pre", result);
//包含内容标签 //包含内容标签
str = "pre<div class=\"test_div\">abc</div>"; str = "pre<div class=\"test_div\">abc</div>";
result = HtmlUtil.unwrapHtmlTag(str, "div"); result = HtmlUtil.unwrapHtmlTag(str, "div");
Assert.assertEquals("preabc", result); Assert.assertEquals("preabc", result);
//带换行 //带换行
str = "pre<div class=\"test_div\">\r\n\t\tabc\r\n</div>"; str = "pre<div class=\"test_div\">\r\n\t\tabc\r\n</div>";
result = HtmlUtil.unwrapHtmlTag(str, "div"); result = HtmlUtil.unwrapHtmlTag(str, "div");
Assert.assertEquals("pre\r\n\t\tabc\r\n", result); Assert.assertEquals("pre\r\n\t\tabc\r\n", result);
} }
@Test
public void unwrapTest2() {
// 避免移除i却误删img标签的情况
String htmlString = "<html><img src='aaa'><i>测试文本</i></html>";
String tagString = "i,br";
String cleanTxt = HtmlUtil.removeHtmlTag(htmlString, false, tagString.split(","));
Assert.assertEquals("<html><img src='aaa'>测试文本</html>", cleanTxt);
}
@Test @Test
public void escapeTest() { public void escapeTest() {
String html = "<html><body>123'123'</body></html>"; String html = "<html><body>123'123'</body></html>";
@ -119,14 +133,14 @@ public class HtmlUtilTest {
Assert.assertEquals(html, restoreEscaped); Assert.assertEquals(html, restoreEscaped);
Assert.assertEquals("'", HtmlUtil.unescape("&apos;")); Assert.assertEquals("'", HtmlUtil.unescape("&apos;"));
} }
@Test @Test
public void filterTest() { public void filterTest() {
String html = "<alert></alert>"; String html = "<alert></alert>";
String filter = HtmlUtil.filter(html); String filter = HtmlUtil.filter(html);
Assert.assertEquals("", filter); Assert.assertEquals("", filter);
} }
@Test @Test
public void removeHtmlAttrTest() { public void removeHtmlAttrTest() {
@ -150,7 +164,7 @@ public class HtmlUtilTest {
result = HtmlUtil.removeHtmlAttr(html, "class"); result = HtmlUtil.removeHtmlAttr(html, "class");
Assert.assertEquals("<div style = \"margin:100%\"></div><span width=100></span>", result); Assert.assertEquals("<div style = \"margin:100%\"></div><span width=100></span>", result);
} }
@Test @Test
public void removeAllHtmlAttrTest() { public void removeAllHtmlAttrTest() {
String html = "<div class=\"test_div\" width=\"120\"></div>"; String html = "<div class=\"test_div\" width=\"120\"></div>";