用于校验HTML标签是否合法,是否闭合, 使用的是HtmlParser开源包
package com.lhb.client.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringUtils;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.PrototypicalNodeFactory;
import org.htmlparser.nodes.RemarkNode;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.CompositeTag;
import org.htmlparser.util.NodeIterator;
public class ValidateHTML {
private final String CONTENT;
private Parser parser;
public ValidateHTML(String content) {
CONTENT = content;
parser = Parser.createParser(content, "GBK");
}
private static String getContent() {
byte[] con = null;
InputStream in = ValidateHTML.class.getResourceAsStream("content.txt");
try {
int length = in.available();
con = new byte[length];
in.read(con, 0, length);
} catch (IOException e) {
e.printStackTrace();
}
try {
return new String(con, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
}
private void recusive(NodeIterator iterator) throws Exception {
while (iterator.hasMoreNodes()) {
Node node = iterator.nextNode();
if (node instanceof TagNode) {
TagNode tagNode = (TagNode)node;
if (!isClosed(tagNode)) {
throw new Exception("发现不完整的错误标签");
}
if (moreTag(tagNode)) {
throw new Exception("发现多余的结束标签");
}
TagNode endTagNode = (TagNode) tagNode.getEndTag();
if (endTagNode == null) {
continue;
}
if (isIgnored(endTagNode)) {
throw new Exception("发现没有闭合的标签");
}
} else if (node instanceof RemarkNode) {
RemarkNode remarkNode = (RemarkNode)node;
if (!remarkNode.toHtml().endsWith("-->")) {
throw new Exception("发现没有闭合的注释标签");
}
}
if (node.getChildren() == null) {
continue;
}
recusive(node.getChildren().elements());
}
}
private boolean isIgnored(TagNode tagNode) {
String tagName = tagNode.getTagName();
int position = tagNode.getTagBegin();
int length = tagName.length() + 3;
String subString = StringUtils.substring(CONTENT, position, position + length);
if (subString == null) {
return true;
}
return !subString.equalsIgnoreCase("</" + tagName + ">");
}
private boolean moreTag(TagNode tagNode) {
return tagNode.toHtml().startsWith("</");
}
//检测不完整的标签或错误标签,例如<script </script>
private boolean isClosed(TagNode tagNode) {
String html = tagNode.toHtml();
int length = tagNode.getTagEnd() - tagNode.getTagBegin();
String tag = StringUtils.substring(html, 0, length);
return tag.endsWith(">");
}
public boolean validate() {
try {
recusive(parser.elements());
return true;
} catch (Exception e) {
//e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
String c = getContent();
ValidateHTML app = new ValidateHTML(c);
boolean result = app.validate();
System.out.println(result);
}
}
分享到:
相关推荐
在Java编程中,读取HTML并过滤特定标签是一项常见的任务,尤其在处理网页抓取、数据提取或构建网络爬虫时。这篇博文链接虽然没有提供具体的内容,但我们可以通过标题和标签来推测其主要讨论的内容。这里我们将深入...
5. 注意事项:虽然该方法可以解决一些常见的HTML标签闭合问题,但是它并不适用于所有情况。特别是复杂的HTML文档中可能含有嵌套标签和特殊情况,简单的字符串处理方法可能无法正确处理。在处理更复杂的HTML文档时,...
语言:English,日本語 This extension is a HTML Tag Checker. HTML TRACKER,HTML TAG CHECKER, HTML标签检测器,有了它,可以验证你的页面是否有HTML未闭合的地方.@Author:斯人 www.imsiren.com
HTML标签冗余检测工具SortSite是一款专为网页开发者和测试工程师设计的专业软件,它能够高效地扫描HTML代码,找出其中的冗余、错误或者不符合最佳实践的标签。这款工具的强大之处在于,它不仅可以帮助优化网页性能,...
python检查html的完整性 读取一个标记,如果是开始标记,入栈 如果是结束标记,看跟栈顶标记是否匹配(一个开始一个结束,名字啥的都一样) 如果匹配,则栈顶标记出栈,如果不匹配,抛异常也好报错也好反正就是用户输入...
HTML标签通常是成对出现的,例如`<div>`和`</div>`,它们定义了一个块级元素。如果`<div>`打开但没有相应的关闭标签,那么后续的元素可能会被错误地包含在这个未闭合的元素内,导致页面布局混乱。同样,在ASPX中,...
不正确的标签闭合不仅会影响到页面的展示效果,还可能导致浏览器解析错误。ASP程序员通常需要确保在内容输出到浏览器之前,所有的HTML或UBB标签都得到正确的闭合。 首先,我们需要理解什么是UBB标签。UBB(Ultimate...
html-fixer NodeJS命令行工具,用于检查html文件和检测不正确的关闭标签。 [![npm版本]( )](http://badge.fury.io/js/html-fixer) 安装打开您的终端并输入: npm install html-fixer -g用法打开您的终端并输入: ...
3. 自闭合标签:有些元素不需要内容,如` `(换行)和`<img>`,它们使用自闭合语法,以`/>`结束。 三、HTML5新增功能 1. 新的结构元素:HTML5引入了更多结构元素,帮助构建语义更清晰的网页。 2. 表单控件:新增...
- **错误检测**:找出不正确的HTML标签、缺失的闭合标签、非法字符等问题。 - **验证标准**:检查代码是否符合HTML5或XHTML规范。 - **自动修复**:在可能的情况下,自动修正语法错误。 - **格式化**:美化代码,使...
根据给定的信息,本文将...通过该函数,可以有效地解决 HTML 代码中标签未闭合的问题,提高了代码的健壮性和可维护性。对于从事 Web 开发的技术人员来说,掌握这一技巧能够在实际工作中节省大量时间,并提升开发效率。
用户在输入 HTML 开始标签时,只需按空格或回车键,插件就会检测到并插入结束标签。 使用 Atom-auto-close-html2 插件,可以提升 HTML 开发者的编码体验,尤其是在处理大量标签的情况下。此外,Atom 本身的可扩展性...
它可以处理HTML5、SVG、Vue、React等多种框架和库的代码,支持自定义配置,如缩进大小、是否关闭自闭合标签等。 6. **Prettier HTML**: 同样是VS Code的扩展,Prettier HTML是Prettier的一个插件,专为HTML格式化...
在HTML5之前,这样的自定义标签是不被浏览器支持的,但在现代浏览器中,它们可以作为自闭合元素或者包含其他元素。 2. **IE8的DOM操作**: Internet Explorer 8(IE8)属于较老的浏览器版本,它不完全支持HTML5的...
- **空标签不需要闭合**:HTML5 中的空标签(如 ` `、`<img>`、`<input>` 等)不需要闭合标签。 - **废弃的标签**:HTML5 不再支持 `<acronym>`、`<applet>`、`<big>` 等旧标签,推荐使用更语义化的标签。 #### ...
5. **错误检查**:工具能自动检测HTML代码中的错误,比如闭合标签缺失、属性格式错误等,便于及时纠正。 6. **版本控制**:一些高级工具可能集成了版本控制功能,如Git,让用户可以轻松管理代码的历史版本,回溯和...
2. **错误检测**:Eclipse Tidy能检查HTML源码中的语法错误,如未闭合的标签、无效的属性或者非法字符等,帮助开发者及时发现并修复问题。 3. **兼容性增强**:考虑到不同浏览器之间的解析差异,Eclipse Tidy会尝试...
- **HTML**:主要用于描述网页的布局和外观,支持固定的数据标签集合,对语法结构的要求相对宽松,例如大小写不敏感、无需严格的标签闭合等。 - **XML**:是一种用于描述数据内容的标记语言,支持自定义标签,强调...
1. **标签闭合**:HTML标签必须正确闭合。例如,`<a>`、`<p>`这样的成对标签需要有对应的结束标签,如`</a>`和`</p>`。对于`<img>`、` `这样的自闭和标签,应当加上斜杠`/>`来完成闭合,如`...