C++ HTML實體解析器


假設我們有一個字串;我們需要設計一個HTML解析器,將HTML語法中的特殊字元替換為普通字元。HTML實體解析器是一個將HTML程式碼作為輸入並將其所有特殊字元實體替換為字元本身的解析器。以下是HTML的特殊字元及其實體:

  • 引號 − 實體是 ",符號字元是 "。

  • 單引號 − 實體是 ',符號字元是 '。

  • 和號 − 實體是 &,符號字元是 &。

  • 大於號 − 實體是 >,符號字元是 >。

  • 小於號 − 實體是 <,符號字元是 <。

  • 斜槓 − 實體是 ⁄,符號字元是 /。

因此,如果輸入類似於"& is changed but &ambassador; is not.",則輸出將是"& is changed but &ambassador; is not."。

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個數組 v = 使用空格分割字串初始化 v

  • ret := 空字串

  • 定義一個對映 m,它將儲存所有HTML符號作為鍵,並儲存相應的特殊字元作為值

  • 對於初始化 i := 0,當 i < v 的大小,更新(i 加 1),執行:

    • s := v[i]

    • temp := 空字串

    • n := v[i] 的大小

    • k := 0

    • 當 k < n 時,執行:

      • 如果 v[i, k] 與 '&' 相同,則:

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

        • (k 加 1)

        • 當 (k < n 且 v[i, 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 連線 m[temp]

    • 否則,當 temp 的大小為 0 時:

      • ret := ret 連線 temp

    • 如果 i 不等於 v 的大小,則:

      • ret := 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.

更新於:2020年11月17日

598 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.