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

ตัวแยกวิเคราะห์เอนทิตี HTML ใน C ++


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