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:
- Almacene la entidad HTML con su carácter en un mapa .
- Recorra la string dada y, si se encuentra algún carácter ‘&’ , busque qué entidad HTML está presente después de este ampersand.
- Agregue el carácter correspondiente con la Entidad en la string de salida.
- 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; }
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:
- Atraviesa la string dada str .
- Mientras atraviesa, si se encuentra algún carácter ‘&’ , busque qué entidad HTML está presente después de este ampersand.
- 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.
- 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; }
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:
- Almacene toda la expresión con su valor asignado en un Map M .
- Para cada clave en el mapa, cree una expresión regular usando:
expresión regular e(clave);
- 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 - 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; }
17 > 25 and 25 < 17
Complejidad temporal: O(N)
Espacio auxiliar: O(N)