C++ 中的 HTML 实体解析器
假设我们有一个字符串;我们需要设计一个 HTML 解析器,将 HTML 语法中的特殊字符替换为普通字符。HTML 实体解析器以 HTML 代码为输入,将所有特殊字符的实体替换为字符本身。以下是 HTML 中的特殊字符及其实体 −
引号 − 的实体为 ",符号字符为 "。
单引号 − 的实体为 ',符号字符为 '。
与号 − 的实体为 &,符号字符为 &。
大于号 − 的实体为 >且符号字符为 >。
小于号 − 表示实体为 < 且符号字符为 <。
斜线 − 表示实体为 ⁄ 且符号字符为 /。
因此,如果输入为"& 已更改但 &ambassador; 未更改",则输出为"& 已更改但 &ambassador;不是。<
为了解决这个问题,我们将遵循以下步骤 −
定义一个数组 v = 通过使用空格拆分字符串来初始化 v
ret := 空字符串
定义一个映射 m,它将所有 HTML 符号作为键,并将相应的特殊字符作为值
初始化 i := 0,当 i < v 的大小时,更新(将 i 增加 1),执行 −
s := v[i]
temp := 空字符串
n := v[i] 的大小
k := 0
当 k < n,执行 −
如果 v[i, k] 与 '&' 相同,则执行 −
temp := temp + v[i, k]
(将 k 增加 1)
当 (k < n 且 v[i, k] 不等于 ';') 时,执行 −
temp := temp + v[i, k]
(将 k 增加 1)
temp := temp + v[i, k]
(将 k 增加 1)
如果 temp 是 m 的成员,则 −
ret := ret + m[temp]
否则
ret := ret + temp
temp := 空字符串
否则
ret := ret + v[i, k]
(将 k 增加 1)
如果 temp 的大小不为 0,且 temp 是 m 的成员,则 −
ret := ret 连接 m[temp]
否则,当 temp 的大小为 0 时,则 −
ret := ret 连接 temp
如果 i 不等于 v 的大小,则 −
ret := ret 连接空格
return ret
示例
让我们看下面的实现,以便更好地理解 −
#include <bits/stdc++.h> using namespace std; class Solution { public: vector <string> split(string& s, char delimiter){ vector <string> tokens; string token; istringstream tokenStream(s); while(getline(tokenStream, token, delimiter)){ tokens.push_back(token); } return tokens; } void out(vector <string> v){ for(string s : v) cout << s << endl; } string entityParser(string text) { vector<string> v = split(text, ' '); string ret = ""; map<string, string> m; m["""] = "\""; m["'"] = "\'"; m["&"] = "&"; m[">"] = ">"; m["<"] = "<"; m["⁄"] = "/"; for (int i = 0; i < v.size(); i++) { string s = v[i]; string temp = ""; int n = v[i].size(); int k = 0; while (k < n) { if (v[i][k] == '&') { temp += v[i][k]; k++; while (k < n && v[i][k] != ';') { temp += v[i][k]; k++; } temp += v[i][k]; k++; if (m.count(temp)) ret += m[temp]; else ret += temp; temp = ""; } else { ret += v[i][k]; k++; } } if (temp.size() && m.count(temp)) { ret += m[temp]; } else if (temp.size()) ret += temp; if (i != v.size() - 1) ret += " "; } return ret; } }; main(){ Solution ob; cout << (ob.entityParser("& is changed but &ambassador; is not.")); }
输入
"& is changed but &ambassador; is not."
输出
& is changed but &ambassador; is not.