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