对于一些练习作业,我的教授挑战了讲座,写了一些从一串文本中删除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;
}
我觉得我很接近,但我没有得到正确的输出。
答案 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;
}
}
它可以按你的意愿工作。