`
wesee
  • 浏览: 23738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HTML 标签闭合性检测

阅读更多
用于校验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);
	}
}


0
0
分享到:
评论
4 楼 jerome_wang 2013-01-22  
wesee 写道
kjah 写道
试了一下,对
<img>
<input>
这种未闭合的检查不出来


是可以检查出来的
我也试了下 检查不出来
3 楼 zhangnanw 2010-04-23  
有没有可以修复的,光检查还不够啊
2 楼 wesee 2010-01-14  
kjah 写道
试了一下,对
<img>
<input>
这种未闭合的检查不出来


是可以检查出来的
1 楼 kjah 2010-01-13  
试了一下,对
<img>
<input>
这种未闭合的检查不出来

相关推荐

    java 读取html过滤标签

    在Java编程中,读取HTML并过滤特定标签是一项常见的任务,尤其在处理网页抓取、数据提取或构建网络爬虫时。这篇博文链接虽然没有提供具体的内容,但我们可以通过标题和标签来推测其主要讨论的内容。这里我们将深入...

    php实现html标签闭合检测与修复方法

    5. 注意事项:虽然该方法可以解决一些常见的HTML标签闭合问题,但是它并不适用于所有情况。特别是复杂的HTML文档中可能含有嵌套标签和特殊情况,简单的字符串处理方法可能无法正确处理。在处理更复杂的HTML文档时,...

    HTML 标签检测器|HTML TAG CHECKER-crx插件

    语言:English,日本語 This extension is a HTML Tag Checker. HTML TRACKER,HTML TAG CHECKER, HTML标签检测器,有了它,可以验证你的页面是否有HTML未闭合的地方.@Author:斯人 www.imsiren.com

    html标签冗余检测工具sortsite

    HTML标签冗余检测工具SortSite是一款专为网页开发者和测试工程师设计的专业软件,它能够高效地扫描HTML代码,找出其中的冗余、错误或者不符合最佳实践的标签。这款工具的强大之处在于,它不仅可以帮助优化网页性能,...

    python检查html的完整性.txt

    python检查html的完整性 读取一个标记,如果是开始标记,入栈 如果是结束标记,看跟栈顶标记是否匹配(一个开始一个结束,名字啥的都一样) 如果匹配,则栈顶标记出栈,如果不匹配,抛异常也好报错也好反正就是用户输入...

    快速检测aspx源码、html源码中标签缺少

    HTML标签通常是成对出现的,例如`&lt;div&gt;`和`&lt;/div&gt;`,它们定义了一个块级元素。如果`&lt;div&gt;`打开但没有相应的关闭标签,那么后续的元素可能会被错误地包含在这个未闭合的元素内,导致页面布局混乱。同样,在ASPX中,...

    asp之自动闭合HTML/ubb标签函数 附简单注释

    不正确的标签闭合不仅会影响到页面的展示效果,还可能导致浏览器解析错误。ASP程序员通常需要确保在内容输出到浏览器之前,所有的HTML或UBB标签都得到正确的闭合。 首先,我们需要理解什么是UBB标签。UBB(Ultimate...

    html-fixer:NodeJS命令行工具,用于检查html文件和检测不正确的关闭标签

    html-fixer NodeJS命令行工具,用于检查html文件和检测不正确的关闭标签。 [![npm版本]( )](http://badge.fury.io/js/html-fixer) 安装打开您的终端并输入: npm install html-fixer -g用法打开您的终端并输入: ...

    html代码运行测试

    3. 自闭合标签:有些元素不需要内容,如` `(换行)和`&lt;img&gt;`,它们使用自闭合语法,以`/&gt;`结束。 三、HTML5新增功能 1. 新的结构元素:HTML5引入了更多结构元素,帮助构建语义更清晰的网页。 2. 表单控件:新增...

    HTMl语法分析程序

    - **错误检测**:找出不正确的HTML标签、缺失的闭合标签、非法字符等问题。 - **验证标准**:检查代码是否符合HTML5或XHTML规范。 - **自动修复**:在可能的情况下,自动修正语法错误。 - **格式化**:美化代码,使...

    c++ html自动补全函数

    根据给定的信息,本文将...通过该函数,可以有效地解决 HTML 代码中标签未闭合的问题,提高了代码的健壮性和可维护性。对于从事 Web 开发的技术人员来说,掌握这一技巧能够在实际工作中节省大量时间,并提升开发效率。

    Atom-auto-close-html2,atom包,自动关闭html标记。投稿于宝泉/汽车.zip

    用户在输入 HTML 开始标签时,只需按空格或回车键,插件就会检测到并插入结束标签。 使用 Atom-auto-close-html2 插件,可以提升 HTML 开发者的编码体验,尤其是在处理大量标签的情况下。此外,Atom 本身的可扩展性...

    JS-HTML-Format(JS及HTML代码格式化工具集合)

    它可以处理HTML5、SVG、Vue、React等多种框架和库的代码,支持自定义配置,如缩进大小、是否关闭自闭合标签等。 6. **Prettier HTML**: 同样是VS Code的扩展,Prettier HTML是Prettier的一个插件,专为HTML格式化...

    在IE8下用JQuery获取自定义标签

    在HTML5之前,这样的自定义标签是不被浏览器支持的,但在现代浏览器中,它们可以作为自闭合元素或者包含其他元素。 2. **IE8的DOM操作**: Internet Explorer 8(IE8)属于较老的浏览器版本,它不完全支持HTML5的...

    解读_HTML5解读_HTML5.pdf

    - **空标签不需要闭合**:HTML5 中的空标签(如 ` `、`&lt;img&gt;`、`&lt;input&gt;` 等)不需要闭合标签。 - **废弃的标签**:HTML5 不再支持 `&lt;acronym&gt;`、`&lt;applet&gt;`、`&lt;big&gt;` 等旧标签,推荐使用更语义化的标签。 #### ...

    HTML网页制作工具

    5. **错误检查**:工具能自动检测HTML代码中的错误,比如闭合标签缺失、属性格式错误等,便于及时纠正。 6. **版本控制**:一些高级工具可能集成了版本控制功能,如Git,让用户可以轻松管理代码的历史版本,回溯和...

    Eclipse的HTML格式化插件 Eclipse Tidy

    2. **错误检测**:Eclipse Tidy能检查HTML源码中的语法错误,如未闭合的标签、无效的属性或者非法字符等,帮助开发者及时发现并修复问题。 3. **兼容性增强**:考虑到不同浏览器之间的解析差异,Eclipse Tidy会尝试...

    基于对称性的到的转换方法

    - **HTML**:主要用于描述网页的布局和外观,支持固定的数据标签集合,对语法结构的要求相对宽松,例如大小写不敏感、无需严格的标签闭合等。 - **XML**:是一种用于描述数据内容的标记语言,支持自定义标签,强调...

    wap 开发html 规范

    1. **标签闭合**:HTML标签必须正确闭合。例如,`&lt;a&gt;`、`&lt;p&gt;`这样的成对标签需要有对应的结束标签,如`&lt;/a&gt;`和`&lt;/p&gt;`。对于`&lt;img&gt;`、` `这样的自闭和标签,应当加上斜杠`/&gt;`来完成闭合,如`...

Global site tag (gtag.js) - Google Analytics