Encuentre la etiqueta final que falta en el código HTML dado

Dada una string htmlCode que es el código HTML de una página web, la tarea es encontrar la etiqueta final que falta en el código HTML.
Ejemplos: 
 

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>

Enfoque: la idea es utilizar la pila para realizar un seguimiento de las etiquetas de inicio actuales en el código HTML y si en algún momento hay una etiqueta final que no coincide con la parte superior de la pila que denota una etiqueta de inicio. Luego, la etiqueta que está en la parte superior de la pila debe cerrarse primero. Por lo tanto, la parte superior de la pila será la etiqueta faltante deseada en el código HTML.
A continuación se muestra la implementación del enfoque anterior:
 

Python

# Python implementation to find the
# the missing end in the HTML code
 
# Function to Auto complete the
# missing tag in the html Code
def 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 Code
if __name__ == "__main__":
    s = """<! DOCTYPE html>
<html>
<head>
    <title>
        GeeksforGeeks
    </title>
</head>
<body>
    <button>
</body>
</html>"""
    tag = autoComplete(s)
    print(tag)
Producción: 

</button>

 

Publicación traducida automáticamente

Artículo escrito por master_abhig y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *