0

嘿,伙计们,我需要确定给定的 HTML 文档是否格式正确。
我只需要一个简单的实现,只使用 Java 核心 API 类,即没有 JTIDY 之类的第三方东西。

实际上,真正需要的是一种扫描 TAGS 列表的算法。如果它找到一个打开标签,而下一个标签不是它对应的关闭标签,那么它应该是另一个打开标签,而它又应该将其关闭标签作为下一个标签,如果没有,它应该是另一个打开标签,然后其对应的关闭标签下一个,并且前一个打开标签的关闭标签以相反的顺序在列表中一个接一个地出现。如果列表符合此顺序,则返回 true 或 false。我已经编写了将标签转换为关闭标签的方法。

这是我已经开始工作的框架代码。它不是太整洁,但它应该让你们对我正在尝试做的事情有一个基本的了解。

public boolean validateHtml(){

    ArrayList<String> tags = fetchTags();
    //fetchTags returns this [<html>, <head>, <title>, </title>, </head>, <body>, <h1>, </h1>, </body>, </html>]

    //I create another ArrayList to store tags that I haven't found its corresponding close tag yet
    ArrayList<String> unclosedTags = new ArrayList<String>();

    String temp;

    for (int i = 0; i < tags.size(); i++) {

        temp = tags.get(i);

        if(!tags.get(i+1).equals(TagOperations.convertToCloseTag(tags.get(i)))){
            unclosedTags.add(tags.get(i));
            if(){

            }

        }else{
            return true;//well formed html
        }
    }

    return true;
}
4

1 回答 1

0

两个想法。首先,也许您可​​以在 html 上使用 XML 解析器?可能更容易,耗时也大大减少。

我没有对此进行太多思考,但对我来说,递归和堆栈将是要走的路。就像是

public myClass(String htmlInput)
{
    openedTags = new Stack<String>();
    this.htmlInput = htmlInput;
}
public boolean validate()
{
    return validate(this.htmlInput);
}
private boolean validate(String html)
{
    boolean result = true;
    String curTag;
    while(htmlLeft)        //worker loop
    {

        if(isOneOffTag(curTag))                 //matches <tags />
            continue;
        else if(isOpenTag(curTag))              //matches <tags>
        {
            openedTags.push(curTag);
            if(!validate(innerHtml))
                return false;
        }
        else if(isCloseTag(curTag))             //matches </tags>
        {
            String lastTag = (String)openedTags.peek();
            if(!tagIsSimiliar(curTag, lastTag))
                return false;
            openedTags.pop();
        }
    }


    return result;
}
private String nextTag(){return null;}
private boolean isOpenTag(String tag){ return true;}
private boolean isCloseTag(String tag){ return true;}
private boolean isOneOffTag(String tag){ return true;}
private boolean tagIsSimiliar(String curTag, String lastTag){return true;}

*编辑1:可能应该已经推入堆栈。

**编辑 2:我想这里的问题是确定当你只返回一个布尔值时你离开的地方。这将需要某种指针,以便您知道您离开的地方。虽然我相信这个想法仍然有效。

于 2011-03-01T20:49:44.280 回答