Find the missing end tag in the given HTML Code - GeeksforGeeks

08 Sep, 2021
Given a string htmlCode which is HTML code of a webpage, the task is to find the missing end tag in the HTML code.Examples:  
Input: htmlCode = "<!DOCTYPE html>
<html>
<head>
    <title>
        GeeksforGeeks
    </title>
</head>
<body>
    <button>
</body>
</html>"
Output: </button>

Input: htmlCode = "<!DOCTYPE html>
<html>
<body>
    <p>Hello</p>
    
</html>"
Output: </body>
 
Approach: The idea is to use stack to keep track of the current start tags in the HTML Code and if at any moment there is an end tag which doesn’t match to the top of the stack which denotes a start tag. Then the tag which is at the top of the stack is to be closed first. Therefore, top of the stack will be the desired missing tag in the HTML Code.Below is the implementation of the above approach: 
Python
# Python implementation to find the# the missing end in the HTML code # Function to Auto complete the# missing tag in the html Codedef autoComplete(s):         # Split the html Code in line    linesOfCode = list(s.strip().split("\n"))         # Tags which are self closed doesn't    # needs to be closed    selfClosedTags = ["area",  "base", "br", \            "col",   "embed",  "hr",    "img", \            "input", "link", "meta", "param", \                    "source", "track", "wbr"]    n = len(linesOfCode)     stack = []         # Loop to iterate over the    # lines of code    for i in range(n):        j = 0                 # Current Line        line = linesOfCode[i]        while j < len(linesOfCode[i]):                         # Condition to check if the current            # character is a end tag in the code            if j + 1 < len(line) and line[j] == "<"\                            and line[j + 1] == "/":                tag = []                j += 2                                 # Loop to get the tag                while j < len(line) and\                   "a" <= line[j] <= "z":                    tag.append(line[j])                    j += 1                while j < len(line) and line[j] != ">":                    j += 1                if stack[-1] != tag:                    tag = stack[-1]                    return "</" + "".join(tag) + ">"                stack.pop()                             # Condition to check if the current            # character denotes the code is            # of the HTML 5            elif j + 1 < len(line) and line[j] == "<"\                                  and line[j] == "!":                continue                             # Condition to check if the current            # tag is a start tag of the HTML Code            elif line[j] == "<":                tag = []                j += 1                                 # Loop to get the tag of the HTML                while j < len(line) and\                      "a" <= line[j] <= "z":                    tag.append(line[j])                    j += 1                while j < len(line) and line[j] != ">":                    j += 1                                     # Condition to check if the                # current tag is not a self closed tag                if "".join(tag) not in selfClosedTags:                    stack.append(tag)            j += 1                 # Condition to check if any tag    # is unbalanced then return that tag    if stack:        tag = stack.pop()        return "</" + "".join(tag) + ">"    return -1 # Driver Codeif __name__ == "__main__":    s = """<! DOCTYPE html><html><head>    <title>        GeeksforGeeks    </title></head><body>    <button></body></html>"""    tag = autoComplete(s)    print(tag)
</button>
 
sagartomar9927
HTML
Pattern Searching
Stack
Stack
Pattern Searching
HTML
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
REST API (Introduction)
HTML Cheat Sheet - A Basic Guide to HTML
Design a web page using HTML and CSS
Form validation using jQuery
Angular File Upload
KMP Algorithm for Pattern Searching
Rabin-Karp Algorithm for Pattern Searching
Naive algorithm for Pattern Searching
Boyer Moore Algorithm for Pattern Searching
Check if a string is substring of another