Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

HTML Entity Parser ใน C++


สมมติว่าเรามีสตริง ต้องออกแบบ HTML parser ที่แทนที่ special character entities ด้วยตัวอักษรจริง: "→", '→', &→&, >→>, <→<, ⁄→/

ตัวอย่าง: "& is changed but &ambassador; is not." → "& is changed but &ambassador; is not."

วิธีแก้ปัญหา

  1. แยกสตริงด้วย space
  2. สแกนแต่ละ token หา pattern &...;
  3. ถ้าตรงกับ entity ใน map ให้แทนที่
  4. รวมกลับเป็นสตริง

ตัวอย่างโค้ด C++

#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; 
    } 
    
    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 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; 
    } 
}; 

int main(){ 
    Solution ob; 
    cout << (ob.entityParser("& is changed but &ambassador; is not.")); 
}

ข้อมูลนำเข้า

"& is changed but &ambassador; is not."

ผลลัพธ์

& is changed but &ambassador; is not.