Analizador de entidades HTML

Dada una string str que tiene varias entidades HTML , la tarea es reemplazar estas entidades con su carácter especial correspondiente.

El analizador de entidades HTML es el analizador que toma el código HTML como entrada y reemplaza todas las entidades de los caracteres especiales por los propios caracteres. Los caracteres especiales y sus entidades para HTML son comillas: la entidad es » y el carácter de símbolo es “.

A continuación se muestran las Entidades HTML con sus correspondientes caracteres especiales en la siguiente tabla:

Nombre/ Descripción Entidad HTML Personaje especial
Espacio    
Y comercial &erio; &
Mas grande que > >
Menos que < <
Comillas simples
Comillas dobles « «
Marca comercial reg; ®
marca de derechos de autor &Copiar; © Barra inclinada

Ejemplos:

Entrada: string = “17 > 25 y 25 < 17”
Salida: 17 > 25 y 25 < 17
Explicación: En el ejemplo anterior > se
reemplaza por el carácter especial correspondiente
> y < se reemplaza por <

Entrada: str = “&copiar; es símbolo de copyright”
Salida: © es símbolo de copyright
Explicación: En el ejemplo anterior © se
reemplaza por el carácter especial correspondiente
©

Método 1: usar unordered_map : a continuación se muestran los pasos:

  1. Almacene la entidad HTML con su carácter en un mapa .
  2. Recorra la string dada y, si se encuentra algún carácter ‘&’ , busque qué entidad HTML está presente después de este ampersand.
  3. Agregue el carácter correspondiente con la Entidad en la string de salida.
  4. Imprime la string de salida como resultado.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <iostream>
#include <unordered_map>
using namespace std;
  
class GfG {
public:
    unordered_map<string, string> m;
  
public:
    // Associating html entity with
    // special character
    void initializeMap()
    {
        m["""] = "\"";
        m["'"] = "'";
        m["&"] = "&";
        m[">"] = ">";
        m["<"] = "<";
        m["⁄"] = "/";
        m[" "] = " ";
        m["®"] = "®";
        m["©"] = "©";
    }
  
public:
    // Function that convert the given
    // HTML Entity to its parsed String
    string parseInputString(string input)
    {
        // Output string
        string output = "";
  
        // Traverse the string
        for (int i = 0;
             i < input.size(); i++) {
  
            // If any ampersand is occurred
            if (input[i] == '&') {
  
                string buffer;
  
                while (i < input.size()) {
  
                    buffer = buffer + input[i];
  
                    // If any Entity is found
                    if (input[i] == ';'
                        && m.find(buffer)
                               != m.end()) {
  
                        // Append the parsed
                        // character
                        output = output
                                 + m[buffer];
  
                        // Clear the buffer
                        buffer = "";
                        i++;
                        break;
                    }
                    else {
                        i++;
                    }
                }
  
                if (i >= input.size()) {
                    output = output
                             + buffer;
                    break;
                }
                i--;
            }
            else {
                output = output
                         + input[i];
            }
        }
  
        // Return the parsed string
        return output;
    }
};
  
// Driver Code
int main()
{
    // Given String
    string input = "17 > 25 and 25 < 17";
    GfG g;
  
    // Initialised parsed string
    g.initializeMap();
  
    // Function Call
    cout << g.parseInputString(input);
    return 0;
}
Producción:

17 > 25 and 25 < 17

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Método 2: usar la coincidencia de patrones:
a continuación se muestran los pasos:

  1. Atraviesa la string dada str .
  2. Mientras atraviesa, si se encuentra algún carácter ‘&’ , busque qué entidad HTML está presente después de este ampersand.
  3. Agregue el carácter correspondiente con la Entidad en la string de salida de la tabla anterior de carácter coincidente en la tabla anterior.
  4. Imprime la string de salida como el resultado después de atravesar la string anterior.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program to Parse the HTML Entities
#include <iostream>
using namespace std;
  
class GfG {
  
public:
    string parseInputString(string input)
    {
  
        // To store parsed string
        string output = "";
  
        for (int i = 0;
             i < input.size(); i++) {
  
            // Matching pattern of html
            // entity
            if (input[i] == '&') {
                string buffer;
  
                while (i < input.size()) {
                    buffer = buffer + input[i];
  
                    // Check match for (\)
                    if (input[i] == ';'
                        && buffer == """) {
                        output = output + "\"";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (')
                    else if (input[i] == ';'
                             && buffer == "'") {
                        output = output + "'";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (&)
                    else if (input[i] == ';'
                             && buffer == "&") {
                        output = output + "&";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (>)
                    else if (input[i] == ';'
                             && buffer == ">") {
                        output = output + ">";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (<)
                    else if (input[i] == ';'
                             && buffer == "<") {
                        output = output + "<";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (/)
                    else if (input[i] == ';'
                             && buffer == "⁄") {
                        output = output + "/";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (" ")
                    else if (input[i] == ';'
                             && buffer == " ") {
                        output = output + " ";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (®)
                    else if (input[i] == ';'
                             && buffer == "®") {
                        output = output + "®";
                        buffer = "";
                        i++;
                        break;
                    }
  
                    // Check match for (©)
                    else if (input[i] == ';'
                             && buffer == "©") {
                        output = output + "©";
                        buffer = "";
                        i++;
                        break;
                    }
                    else {
                        i++;
                    }
                }
  
                if (i >= input.size()) {
                    output = output + buffer;
                    break;
                }
                i--;
            }
            else {
                output = output + input[i];
            }
        }
  
        // Return the parsed string
        return output;
    }
};
  
// Driver Code
int main()
{
    // Given String
    string input = "17 > 25 and 25 < 17";
    GfG g;
  
    // Initialised parsed string
    g.initializeMap();
  
    // Function Call
    cout << g.parseInputString(input);
    return 0;
}
Producción:

17 > 25 and 25 < 17

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Método 3: usar expresiones regulares :
a continuación se muestran los pasos:

  1. Almacene toda la expresión con su valor asignado en un Map M .
  2. Para cada clave en el mapa, cree una expresión regular usando:

    expresión regular e(clave);

  3. Ahora reemplace la expresión regular anterior formada con su valor asignado en el Mapa M como:

    regex_replace(string, e, valor);
    donde,
    str es la string de entrada,
    e es la expresión formada en el paso anterior y
    val es el valor asignado con la expresión e en el Mapa

  4. Repita los pasos anteriores hasta que no se reemplacen todas las expresiones.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <iostream>
#include <regex>
#include <unordered_map>
using namespace std;
  
// Given Expression with mapped value
const unordered_map<string, string> m;
m = { { """, "\" },
        { "'", "'" },
        { "&", "&" },
        { ">", ">" },
        { "<", "<" },
        { "⁄", "/" } };
  
// Function that converts the given
// HTML Entity to its parsed String
string
parseInputString(string input)
{
    for (auto& it : m) {
  
        // Create ReGex Expression
        regex e(it.first);
  
        // Replace the above expression
        // with mapped value using
        // regex_replace()
        input = regex_replace(input, e,
                              it.second);
    }
  
    // Return the parsed string
    return input;
}
  
// Driver Code
int main()
{
    // Given String
    string input
        = "17 > 25 and 25 < 17";
  
    // Function Call
    cout << parseInputString(input);
    return 0;
}
Producción:

17 > 25 and 25 < 17

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por ShJos 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 *