สมมติว่าเรามีสตริง เราต้องออกแบบตัวแยกวิเคราะห์ HTML หนึ่งตัวที่จะแทนที่อักขระพิเศษของไวยากรณ์ HTML เป็นอักขระปกติ parser เอนทิตี HTML คือ parser ที่ใช้โค้ด HTML เป็นอินพุตและแทนที่เอนทิตีทั้งหมดของอักขระพิเศษด้วยอักขระเอง เหล่านี้เป็นอักขระพิเศษและเอนทิตีสำหรับ HTML -
-
เครื่องหมายอัญประกาศ - เอนทิตีคือ " และอักขระสัญลักษณ์คือ "
-
Single Quote Mark – เอนทิตีคือ ' และสัญลักษณ์คือ '
-
เครื่องหมาย - เอนทิตีคือ &และอักขระสัญลักษณ์คือ &.
-
เครื่องหมายมากกว่า - เอนทิตีคือ> และอักขระสัญลักษณ์คือ>.
-
Less Than Sign - เอนทิตีคือ <และอักขระสัญลักษณ์คือ <.
-
Slash - เอนทิตีคือ ⁄ และอักขระสัญลักษณ์คือ /.
ดังนั้น หากอินพุตเป็นเหมือน "&ถูกเปลี่ยน แต่ &ambassador; ไม่ใช่" ผลลัพธ์จะเป็น "&ถูกเปลี่ยน แต่ &ambassador; ไม่ใช่"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ v =เริ่มต้น v โดยแยกสตริงโดยใช้ช่องว่าง
-
ret :=สตริงว่าง
-
กำหนดหนึ่งแผนที่ m ซึ่งจะเก็บสัญลักษณ์ HTML ทั้งหมดเป็นคีย์และอักขระพิเศษที่เกี่ยวข้องเป็นค่า
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
s :=v[i]
-
temp :=สตริงว่าง
-
n :=ขนาดของ v[i]
-
k :=0
-
ในขณะที่ k
-
ถ้า v[i, k] เหมือนกับ '&' แล้ว −
-
temp :=temp + v[i, k]
-
(เพิ่ม k ขึ้น 1)
-
ในขณะที่ (k
-
temp :=temp + v[i, k]
-
(เพิ่ม k ขึ้น 1)
-
-
temp :=temp + v[i, k]
-
(เพิ่ม k ขึ้น 1)
-
ถ้า temp เป็นสมาชิกของ m แล้ว −
-
ret :=ret + m[ชั่วคราว]
-
-
มิฉะนั้น
-
ret :=ret + ชั่วคราว
-
-
temp :=สตริงว่าง
-
-
มิฉะนั้น
-
ret :=ret + v[i, k]
-
(เพิ่ม k ขึ้น 1)
-
-
-
ถ้าขนาดของ temp ไม่ใช่ 0 และ temp เป็นสมาชิกของ m แล้ว −
-
ret :=ret concatenate m[ชั่วคราว]
-
-
มิฉะนั้นเมื่อขนาดของอุณหภูมิแล้ว −
-
ret :=ret concatenate ชั่วคราว
-
-
ถ้า i ไม่เท่ากับขนาดของ v แล้ว −
-
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.