从一串文本中删除HTML标记

时间:2018-03-17 06:21:02

标签: c++

对于一些练习作业,我的教授挑战了讲座,写了一些从一串文本中删除HTML标签的代码。他提到了一个特定的命令,我们将在稍后学习,这将为我们做到这一点,但他希望我们手动这样做。

这是我到目前为止所拥有的:

#include<iostream>
#include<string>
using namespace std;

int main() {
  string name = "<HTML> smelly </b> butts </b> smell<test>";
  cout << name << endl;

  int a = 0, b = 0;

  for (int a = b; a < name.length(); a++) {
      if (name[a] == '<') {
          for (int b = a; b < name.length(); b++) {
              if (name[b] == '>') {
                  name.erase(a, (b + 1));
                  break;
              }
          }
      }
  }

  cout << name << endl;

  system("pause");
  return 0;
}

我觉得我很接近,但我没有得到正确的输出。

2 个答案:

答案 0 :(得分:2)

这是另一种不太复杂且稍微清晰的方式,可以说更具可读性。它不处理嵌套标签,但您可以扩展它以使其更好。

#include <string>
#include <iostream>

int main()
{
    std::string html = "<HTML> Something <b> slightly less </b> profane here <test>";

    while (html.find("<") != std::string::npos)
    {
        auto startpos = html.find("<");
        auto endpos = html.find(">") + 1;

        if (endpos != std::string::npos)
        {
            html.erase(startpos, endpos - startpos);
        }
    }

    std::cout << html << '\n';

    return 0;
}

为清楚起见,当搜索到的字符串在字符串中没有位置时,将返回std::string::npos。因此,虽然文档中仍有HTML开头标记。擦除您可以找到的第一个开口和第一个闭合括号之间的所有内容。它并没有与5 < 2<html>分开,因此存在缺陷,但它显示了一种可以作为起点应用的不同方法。

答案 1 :(得分:0)

for (int b = a; b < name.length(); b++) {
    if (name[b] == '>') {
        name.erase(a, (b + 1));
        break;
    }
}

在这部分代码中,你正在删除长度(b)的一部分,而你应该删除一部分长度(b - a)

试试这个:

for (int b = a; b < name.length(); b++) {
    if (name[b] == '>') {
        name.erase(a, (b - a + 1));
        break;
    }
}

它可以按你的意愿工作。