【发布时间】:2014-04-15 00:33:01
【问题描述】:
在我的应用程序中,我需要在不使用尽可能少的外部库的情况下解析简单的 HTML 代码。我的 HTML 看起来像
<p> First Content is P </p><h2>Header</h2><p> Text under header </p>
<h2>Header 2</h2><p> Paragraph </p>
<h3>yep</h3><p> no </p>
我的 html 仅包含标签 p, h2, h3。我得到了以下结构:
struct Elements {
std::string tag;
std::string content;
};
std::vector<Elements> elems;
所以我的目标是在解析向量中的每个元素后应该包含这样的数据:
tag = "h2"
content = "Header"
和
tag = "p"
content = "First Content is P"
PP:我需要按照它们在 HTML 中呈现的顺序获取元素。
编辑:
我只是在 javascript 中做了这个,它工作正常,但我基本上不知道如何用 c++ 写下来:
var a = "<p> First Content is P </p><h2>Header</h2><p> Text under header </p>" +
"<h2>Header 2</h2><p> Paragraph </p>" +
"<h3>yep</h3><p> no </p>";
var output = [];
a.replace(/<\b[^>]*>(.*?)<\/(.*?)>/gmi, function(m, key, value) {
output.push({
tag: value,
data: key
});
})
/*
output:
{ tag: "p", data: "First Content is P"},
{ tag: "h2", data: "Header" }
.....
*/
【问题讨论】:
-
你是指 HTML 还是 XHTML? HTML 允许标签没有结束元素等...
-
您自己几乎从未编写过的两件事:加密和 HTML/XML 解析器。 You may find this interesting
-
我所有的元素都有开始和结束标签。因为我只有 3 个标签,我可以对它们进行硬编码,我认为这可以通过某种正则表达式来实现吗?
-
“我认为这可以通过某种正则表达式来实现吗?” - 所以你确实知道如何开始......你为什么不试一试并告诉我们你在哪里卡住了? (以上所有警告的强制性回声)。说真的,如果你还没有准备好自己做,你必须使用图书馆。无论您自己(很快)编写的任何解决方案都可能非常脆弱。
-
这是一个完全合法的学习使用 C++ 的迷你项目。谷歌“Lexer”和“Parser”(这有点矫枉过正,但给了你一个想法。如果你碰巧有 stroustrup 的书,并且版本没有改变这一点,他曾经在章节中有一个波兰语反向符号简单算术表达式解析器6,它处理更复杂的解析,但给你一个想法(虽然你不需要从你描述你的语言的方式中递归下降)。