C++ HTML实体解析器
假设我们有一个字符串;我们需要设计一个HTML解析器,将HTML语法中的特殊字符替换为普通字符。HTML实体解析器是一个将HTML代码作为输入并将其所有特殊字符实体替换为字符本身的解析器。以下是HTML的特殊字符及其实体:
引号 − 实体是 ",符号字符是 "。
单引号 − 实体是 ',符号字符是 '。
和号 − 实体是 &,符号字符是 &。
大于号 − 实体是 >,符号字符是 >。
小于号 − 实体是 <,符号字符是 <。
斜杠 − 实体是 ⁄,符号字符是 /。
因此,如果输入类似于"& is changed but &ambassador; is not.",则输出将是"& is changed but &ambassador; is not."。
为了解决这个问题,我们将遵循以下步骤:
定义一个数组 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 连接空格
返回 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.
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP