কম্পিউটার টিউটোরিয়াল

C++-এ HTML এন্টিটি পার্সার


একটি স্ট্রিং দেওয়া আছে। HTML স্পেশাল ক্যারেক্টার এন্টিটিগুলো (যেমন ", &, <, >, ⁄) তাদের নরমাল ক্যারেক্টারে রিপ্লেস করতে হবে।

ইনপুট: "& is changed but &ambassador; is not." → আউটপুট: "& is changed but &ambassador; is not."

সমাধানের ধাপগুলো:

  • HTML এন্টিটি ম্যাপ m বানাব

  • স্ট্রিংকে স্পেস দিয়ে স্প্লিট করব (ওয়ার্ড বাই ওয়ার্ড প্রসেস)

  • প্রতি ওয়ার্ডে & পেলে ; পর্যন্ত পার্স করব

  • যদি ম্যাপে থাকে তবে রিপ্লেস করব, না থাকলে অরিজিনাল রাখব

  • ফাইনাল স্ট্রিং জড়িয়ে রিটার্ন করব

উদাহরণ

নিচের কোডটি দেখুন −

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

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.

  1. C++-এ জিগজ্যাগ কনভার্সন (ZigZag Conversion)

  2. C++-এ String at() মেথড ব্যবহার

  3. C++-এ স্ট্রিং টোকেনাইজেশন: স্ট্রিম এবং getline() ব্যবহার

  4. C++-এ স্ট্রিং টোকেনাইজ (Tokenize) করা