首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用C++ std::sregex_token_iterator提取HTML注释

使用C++ std::sregex_token_iterator提取HTML注释
EN

Stack Overflow用户
提问于 2018-08-07 06:30:03
回答 1查看 294关注 0票数 1

我正在尝试从HTML源代码中提取评论部分。它在某种程度上是有效的,但并不完全有效。

代码语言:javascript
复制
<html><body>Login Successful!</body><!-- EXTRACT-THIS --></html>

到目前为止,我的代码如下:

代码语言:javascript
复制
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
#include <regex>

using namespace std;

int main()
{
    string s = 
    "<html><body>Login Successful!</body><!-- EXTRACT-THIS --></html>";

    // Regular expression to extract from HTML comment 
    // <!-- comment -->
    regex  r("[<!--\r\n\t][\r\n\t-->]");

    for (sregex_token_iterator it = sregex_token_iterator(
                                        s.begin(), 
                                        s.end(), 
                                        r, 
                                        -1); 
         it != sregex_token_iterator(); ++it)
    {
        cout << "TOKEN: " << (string) *it << endl;
    }

    return 0;
}

我想我的主要问题是,有没有办法改进我的正则表达式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-07 06:57:32

让我们从一个包含多个评论部分的std::string开始:

代码语言:javascript
复制
string s = "<html><body>Login Successful!</body><!-- EXTRACT-THIS --><p>Test</p><!-- XXX --></html>";

删除注释并打印HTML标记

如果你想从这个字符串中删除HTML注释,你可以这样做:

代码语言:javascript
复制
regex r("(<\\!--[^>]*-->)");

// split the string using the regular expression
sregex_token_iterator iterator = sregex_token_iterator(s.begin(), s.end(), r, -1);
sregex_token_iterator end;
for (; iterator != end; ++iterator)
{
    cout << "TOKEN: " << (string) *iterator << endl;
}

此代码打印如下:

代码语言:javascript
复制
TOKEN: <html><body>Login Successful!</body>
TOKEN: <p>Test</p>
TOKEN: </html>

删除HTML标记并打印注释

如果你想从字符串中提取注释,你可以像这样使用std::sregex_iterator

代码语言:javascript
复制
regex r("(<\\!--[^>]*-->)");

std::sregex_iterator next(s.begin(), s.end(), r);
std::sregex_iterator end;
while (next != end) {
    std::smatch match = *next;
    std::cout << match.str() << "\n";
    next++;
}

此代码打印如下:

代码语言:javascript
复制
<!-- EXTRACT-THIS -->
<!-- XXX -->

手动解析评论标签

另一种选择是手动查找和迭代开始标记和结束标记。我们可以使用std::string::find()std::string::substr()方法:

代码语言:javascript
复制
const std::string OPEN_TAG = "<!--";
const std::string CLOSE_TAG = "-->";

auto posOpen = s.find(OPEN_TAG, 0);
while (posOpen != std::string::npos) {
    auto posClose = s.find(CLOSE_TAG, posOpen);
    std::cout << s.substr(posOpen, posClose - posOpen + CLOSE_TAG.length()) << '\n';
    posOpen = s.find(OPEN_TAG, posClose + CLOSE_TAG.length());
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51716467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档