gpt4 book ai didi

c++ - 在 C++ 字符串中转义 XML/HTML 的最有效方法?

转载 作者:IT老高 更新时间:2023-10-28 12:50:14 25 4
gpt4 key购买 nike

我不敢相信以前没有人问过这个问题。我有一个字符串需要插入到 HTML 文件中,但它可能包含特殊的 HTML 字符。我想用适当的 HTML 表示替换这些。

下面的代码可以工作,但是非常冗长和丑陋。性能对我的应用程序来说并不重要,但我想这里也存在可伸缩性问题。我该如何改进呢?我想这是 STL 算法或一些深奥的 Boost 函数的工作,但下面的代码是我自己能想到的最好的。

void escape(std::string *data)
{
std::string::size_type pos = 0;
for (;;)
{
pos = data->find_first_of("\"&<>", pos);
if (pos == std::string::npos) break;
std::string replacement;
switch ((*data)[pos])
{
case '\"': replacement = "&quot;"; break;
case '&': replacement = "&amp;"; break;
case '<': replacement = "&lt;"; break;
case '>': replacement = "&gt;"; break;
default: ;
}
data->replace(pos, 1, replacement);
pos += replacement.size();
};
}

最佳答案

您可以使用动态替换进行复制,而不是仅仅替换原始字符串,从而避免移动字符串中的字符。这将有更好的复杂性和缓存行为,所以我期待一个巨大的改进。或者您可以使用 boost::spirit::xml encodehttp://code.google.com/p/pugixml/ .

void encode(std::string& data) {
std::string buffer;
buffer.reserve(data.size());
for(size_t pos = 0; pos != data.size(); ++pos) {
switch(data[pos]) {
case '&': buffer.append("&amp;"); break;
case '\"': buffer.append("&quot;"); break;
case '\'': buffer.append("&apos;"); break;
case '<': buffer.append("&lt;"); break;
case '>': buffer.append("&gt;"); break;
default: buffer.append(&data[pos], 1); break;
}
}
data.swap(buffer);
}

编辑:可以通过使用启发式方法来确定缓冲区的大小来实现小幅改进。将 buffer.reserve 行替换为 data.size()*1.1 (10%) 或类似内容,具体取决于预期的替换量。

关于c++ - 在 C++ 字符串中转义 XML/HTML 的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5665231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com