C ++从字符串中获取值

时间:2016-03-12 18:34:50

标签: c++

我需要从字符串中获取值。我有这段HT​​ML:

<input type="hidden" name="wtkn" value="56e45dbe_wNIT/DcufUPvZOL33jmkyqGpKxw=">

在C ++中这段代码:

  static string pat4 = " name=\"wtkn\"";
  string::size_type wtkn;
  if ((wtkn = l.find(pat4)) != string::npos)
  {   
    l.erase(0,401);
    l.erase(37,43);   
        string token = l; 

    return token;      

  } 

所以我需要来自HTML: 56e45dbe_wNIT / DcufUPvZOL33jmkyqGpKxw = 但是这个字符串大约是37或38个字符。所以擦除东西不是最好的选择。

2 个答案:

答案 0 :(得分:1)

使用内置的C ++对象和函数,您可以执行以下操作:

示例代码

#include <iostream>
#include <string>

std::string getValue(const std::string &html)
{
    static const std::string VALUE = "value";
    static const char DOUBLE_QUOTE = '"';

    std::string result;

    std::size_t pos = html.find(VALUE);
    if (pos != std::string::npos)
    {
        std::size_t beg = html.find_first_of(DOUBLE_QUOTE, pos);

        if (beg != std::string::npos)
        {
            std::size_t end = html.find_first_of(DOUBLE_QUOTE, beg + 1);

            if (end != std::string::npos)
            {
                result = html.substr(beg + 1, end - beg - 1);
            }
        }
    }

    return result;
}

int main()
{
    std::string html = "<input type=\"hidden\" name=\"wtkn\" value=\"56e45dbe_wNIT/DcufUPvZOL33jmkyqGpKxw=\">";
    std::cout << "HTML: " << html << "\n";
    std::cout << "value: " << getValue(html) << "\n";
    return 0;
}

示例输出

HTML: <input type="hidden" name="wtkn" value="56e45dbe_wNIT/DcufUPvZOL33jmkyqGpKxw=">
value: 56e45dbe_wNIT/DcufUPvZOL33jmkyqGpKxw=

Live Example

注意:强大的解决方案可能需要进行额外的错误检查。此示例实现还具有一些先决条件(例如,包含value关键字,后跟打开和关闭双引号之间的所需文本。)

答案 1 :(得分:1)

由于要求很简单,您只需使用标准库string方法即可解析它。您可以使用find搜索" value="(与" name=\"wtkn\""使用的相同,然后搜索下一个双引号("):

const string deb = " value=\";
size_t deb_pos = l.find(deb);
if (deb_pos == string::npos) throw exception("deb not found");
deb_pos += deb.size();
size_t end_pos = l.find('"', deb_pos);
if (end_pos == string::npos) throw exception("end not found");
string token = l.substr(deb_pos, end_pos);

如果等号周围有额外的空格,或者字符串中有引号双引号(\"),它会破坏,但是如果你可以确定它不会发生,那可能会足够(小心:未经测试)