【问题标题】:Algorithm to determine proper html tag closing确定正确的html标签关闭的算法
【发布时间】:2016-01-11 21:30:01
【问题描述】:

我正在用 JAVA 编写自己的 HTML 解析器实现。 到目前为止,我已经完成了词法分析器并开始编写解析器。我正在创建 DOM 树,我想确定我的 HTML 是否构造正确。

例如,我有一个 img 标签,它是一个基于 w3 org html syntaxvoid 标签p>

它不需要结束标记。

另一方面,bodyhead等大部分标签都必须有结束标签。

我的问题是:处理这个问题的正确方法是什么?

我不需要工具或任何外部网站来确定,我在问什么是确定的方法。

【问题讨论】:

标签: java html algorithm parsing tags


【解决方案1】:

您正在处理 HTML,因此标签集非常有限。您可以轻松跟踪标签是否为 void 标签。

对于其余的标签,我建议使用以下算法:

  1. 获取下一个标签。 (a) 如果它是一个开始标签,例如 ,只需将它推送到 Stack。 (b) 如果是结束标签,则转到步骤 2。 (c) 如果没有更多的标签需要解析,你的 HTML 是有效的。

  2. 从堆栈中逐一弹出标签。 (a) 如果您在到达当前标签的开始对之前在堆栈上遇到另一个 开始标签,那么您的 HTML 结构已损坏。 (b) 如果您清空堆栈并且当前的 结束标记 仍然没有一对,那么再次说明您的 HTML 已损坏。 (c) 如果您遇到当前标签的开始对,请避免使用情况 (a) 和 (b)。转到第 1 步。

这是一个粗略的伪代码,但我希望你能明白。如有必要,我可以用 Java/C# 编写实现。

【讨论】:

    【解决方案2】:

    这是许多软件公司的经典“求职面试问题”。它是关于检查字符串(在本例中为您的 HTML 代码)是否相对于某些字符(在本例中为 HTML 标记)保持平衡。使用堆栈解决此问题。当您处理字符串时,对于每个开始标签,您调用“推送”操作。对于每个结束标记,您调用一个“pop”操作。如果在处理结束时堆栈为空(并且在分析过程中没有发现错误),您的 HTML 代码将被平衡。下面的函数检查一个字符串是否在括号方面是平衡的。

    private boolean isBalanced(String s) {
    
        Stack symbolStack = new Stack();
    
        for(int i = 0; i < s.length(); i++) { //Processing the input string ...
    
            char c = s.charAt(i);
    
            if(c == '(') { //If the character is an opening parenthesis --> push
    
                symbolStack.push(c);
            }
            else if(c == ')') { //If the character is a closing parenthesis ...
    
                if(symbolStack.isEmpty()) { //Error: the stack is empty
                    return false;
                }
                else {
                    char c2 = (char) symbolStack.pop();
    
                    if(c2 != '(') { //Error: no opening parenthesis in the stack
                        return false;
                    }
                }
            }
        }
    
        if(symbolStack.isEmpty()) { //No error and empty stack --> balanced string
            return true;
        }
    
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2013-08-13
      相关资源
      最近更新 更多