কম্পিউটার

C++ এ HTML সত্তা পার্সার


ধরুন আমাদের একটি স্ট্রিং আছে; আমাদের একটি এইচটিএমএল পার্সার ডিজাইন করতে হবে যা এইচটিএমএল সিনট্যাক্সের বিশেষ অক্ষরটিকে সাধারণ অক্ষরে প্রতিস্থাপন করবে। HTML সত্তা পার্সার হল সেই পার্সার যা HTML কোডকে ইনপুট হিসেবে নেয় এবং বিশেষ অক্ষরের সমস্ত সত্তাকে অক্ষর দ্বারা প্রতিস্থাপন করে। HTML-

-এর জন্য এইগুলি বিশেষ অক্ষর এবং তাদের সত্তা
  • উদ্ধৃতি চিহ্ন − সত্তা হল " এবং প্রতীক অক্ষর হল "৷

  • একক উদ্ধৃতি চিহ্ন − সত্তা হল ' এবং প্রতীক অক্ষর হল '৷

  • অ্যাম্পারস্যান্ড − সত্তা হল &এবং প্রতীক অক্ষর হল &.

  • চিহ্নের চেয়ে বৃহত্তর − সত্তা হল> এবং প্রতীক অক্ষর হল>।

  • চিহ্নের চেয়ে কম − সত্তা হল <এবং প্রতীক অক্ষর হল <।

  • স্ল্যাশ − সত্তা হল ⁄ এবং প্রতীক অক্ষর হল /.

সুতরাং, যদি ইনপুটটি "&পরিবর্তিত হয় কিন্তু &দূত; হয় না।" এর মত হয়, তাহলে আউটপুট হবে "&পরিবর্তিত হয়েছে কিন্তু &দূত; নয়।"

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি অ্যারে সংজ্ঞায়িত করুন v =স্পেস ব্যবহার করে স্ট্রিংকে বিভক্ত করে v আরম্ভ করুন

  • ret :=খালি স্ট্রিং

  • একটি মানচিত্র m সংজ্ঞায়িত করুন, এটি সমস্ত HTML চিহ্নকে কী এবং সংশ্লিষ্ট বিশেষ অক্ষরকে মান হিসাবে ধরে রাখবে

  • আরম্ভ করার জন্য i :=0, যখন i

    • 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[temp]

        • অন্যথায়

          • ret :=ret + temp

        • temp :=খালি স্ট্রিং

      • অন্যথায়

        • ret :=ret + v[i, k]

        • (k 1 দ্বারা বাড়ান)

    • যদি temp এর আকার 0 না হয় এবং temp হয় m এর সদস্য, তাহলে −

      • ret :=ret concatenate m[temp]

    • অন্যথায় যখন তাপমাত্রার আকার, তারপর −

      • ret :=ret concatenate temp

    • যদি আমি v এর আকারের সমান না হয়, তাহলে −

      • ret :=ret concatenate ফাঁকা স্থান

  • রিটার্ন রিটার্ন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#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.

  1. C++ এ ZigZag রূপান্তর

  2. C++ এ () এ স্ট্রিং

  3. C++ এ একটি স্ট্রিং টোকেনাইজ করা

  4. C++ এ একটি স্ট্রিংকে টোকেনাইজ করবেন?