C++ 中的 HTML 实体解析器

c++server side programmingprogramming更新于 2025/6/25 2:22:17

假设我们有一个字符串;我们需要设计一个 HTML 解析器,将 HTML 语法中的特殊字符替换为普通字符。HTML 实体解析器以 HTML 代码为输入,将所有特殊字符的实体替换为字符本身。以下是 HTML 中的特殊字符及其实体 −

  • 引号 − 的实体为 ",符号字符为 "。

  • 单引号 − 的实体为 ',符号字符为 '。

  • 与号 − 的实体为 &,符号字符为 &。

  • 大于号 − 的实体为 >且符号字符为 >。

  • 小于号 − 表示实体为 < 且符号字符为 <。

  • 斜线 − 表示实体为 ⁄ 且符号字符为 /。

因此,如果输入为"& 已更改但 &ambassador; 未更改",则输出为"& 已更改但 &ambassador;不是。<

为了解决这个问题,我们将遵循以下步骤 −

  • 定义一个数组 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 连接空格

  • return 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.

相关文章