Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 HTML 엔티티 파서

<시간/>

문자열이 있다고 가정합니다. HTML 구문의 특수 문자를 일반 문자로 대체할 하나의 HTML 파서를 설계해야 합니다. HTML 엔터티 파서는 HTML 코드를 입력으로 받아 특수 문자의 모든 엔터티를 문자 자체로 바꾸는 파서입니다. 다음은 HTML에 대한 특수 문자 및 해당 엔터티입니다. −

  • 따옴표 - 엔티티는 "이고 기호 문자는 ".

  • 작은따옴표 - 엔티티는 '이고 기호 문자는 '입니다.

  • 앰퍼샌드 - 엔티티는 &이고 기호 문자는 &입니다.

  • 보다 큼 기호 - 엔터티는>이고 기호 문자는>.

    입니다.
  • 보다 작음 - 엔티티는 <이고 기호 문자는 <.

    입니다.
  • 슬래시 - 엔티티는 ⁄이고 기호 문자는 /입니다.

따라서 입력이 "&는 변경되었지만 &ambassador;는 변경되지 않았습니다."와 같은 경우 출력은 "&는 변경되지만 &ambassador;는 변경되지 않습니다."

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 배열 정의 v =공백을 사용하여 문자열을 분할하여 v 초기화

  • ret :=빈 문자열

  • 하나의 맵 m을 정의하면 모든 HTML 기호가 키로 유지되고 해당 특수 문자가 값으로 유지됩니다.

  • initialize i :=0의 경우 i

    • s :=v[i]

    • temp :=빈 문자열

    • n :=v[i]의 크기

    • k :=0

    • k

      • v[i, k]가 '&'와 같으면 -

        • 온도 :=온도 + v[i, k]

        • (k를 1씩 증가)

        • 동안 (k

          • 온도 :=온도 + v[i, k]

          • (k를 1씩 증가)

        • 온도 :=온도 + v[i, k]

        • (k를 1씩 증가)

        • temp가 m의 구성원이면 -

          • ret :=ret + m[온도]

        • 그렇지 않으면

          • ret :=ret + temp

        • temp :=빈 문자열

      • 그렇지 않으면

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

        • (k를 1씩 증가)

    • temp의 크기가 0이 아니고 temp가 m의 구성원이면 -

      • ret :=ret m[temp] 연결

    • 그렇지 않으면 임시 크기의 경우 -

      • ret :=ret 연결 온도

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