Computer >> Máy Tính >  >> Lập trình >> C ++

Trình phân tích cú pháp thực thể HTML trong C ++

Giả sử chúng ta có một chuỗi; chúng ta phải thiết kế một trình phân tích cú pháp HTML sẽ thay thế ký tự đặc biệt của cú pháp HTML thành ký tự bình thường. Trình phân tích cú pháp thực thể HTML là trình phân tích cú pháp lấy mã HTML làm đầu vào và thay thế tất cả các thực thể của các ký tự đặc biệt bằng chính các ký tự đó. Đây là các ký tự đặc biệt và các thực thể của chúng cho HTML -

  • Dấu ngoặc kép - thực thể là "và ký tự biểu tượng là".

  • Dấu Trích dẫn Đơn - thực thể là 'và ký tự biểu tượng là'.

  • Ký hiệu và - thực thể là &và ký tự biểu tượng là &.

  • Dấu hiệu lớn hơn - thực thể là> và ký tự biểu tượng là>.

  • Dấu hiệu nhỏ hơn - thực thể là

  • Dấu gạch chéo - thực thể là ⁄ và ký tự biểu tượng là /.

Vì vậy, nếu đầu vào giống như "&được thay đổi nhưng &đại sứ; không phải.", Thì đầu ra sẽ là "&được thay đổi nhưng &đại sứ; không."

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một mảng v =khởi tạo v bằng cách tách chuỗi sử dụng dấu cách

  • ret:=chuỗi trống

  • Xác định một bản đồ m, điều này sẽ giữ tất cả biểu tượng HTML làm khóa và ký tự đặc biệt tương ứng làm giá trị

  • để khởi tạo i:=0, khi i

    • s:=v [i]

    • temp:=chuỗi trống

    • n:=kích thước của v [i]

    • k:=0

    • trong khi k

      • nếu v [i, k] giống với '&' thì -

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

        • (tăng k lên 1)

        • while (k

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

          • (tăng k lên 1)

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

        • (tăng k lên 1)

        • nếu tạm thời là thành viên của m, thì -

          • ret:=ret + m [temp]

        • Nếu không

          • ret:=ret + temp

        • temp:=chuỗi trống

      • Nếu không

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

        • (tăng k lên 1)

    • nếu kích thước của nhiệt độ không phải là 0 và nhiệt độ là thành viên của m, thì -

      • ret:=ret nối m [temp]

    • ngược lại khi kích thước của nhiệt độ thì -

      • ret:=ret nối temp

    • nếu tôi không bằng kích thước của v, thì -

      • ret:=ret nối khoảng trống

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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."));
}

Đầu vào

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

Đầu ra

& is changed but &ambassador; is not.