สมมติว่าเรามีสตริง เราต้องออกแบบตัวแยกวิเคราะห์ 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.