【问题标题】:locating all substring instances in a given file定位给定文件中的所有子字符串实例
【发布时间】:2012-08-17 01:32:34
【问题描述】:

我目前正在开发一个函数来查找 html 文件中引用的所有图像,目前我正在尝试在文件中查找这些子字符串:".bmp"".gif"".jpg"".png" 并且还想找到它们的根,例如:/images/foo/,然后使用这两个子字符串创建一个新字符串:/images/foo/bar.jpg 我知道我将如何连接字符串,但我不知道如何找到实际的子字符串,我觉得现在非常不知所措,非常感谢一些帮助。

【问题讨论】:

  • 如果您可以假设格式正确的输入,则无需进行任何连接。只需找到子字符串,然后向后搜索,直到找到"。一旦找到,您只需根据找到的索引提取字符串。不过,最好使用 HTML 解析器。
  • 使用 HTML 解析器并遍历所有 <img> 节点,收集 src 属性的值
  • @Doug:如果 HTML 文档使用不同的引号(例如 ')或根本没有引号或其他一些您没有考虑过的诡计,那将失败。如果包含 .jpg.gif 的字符串出现在文档中的其他位置(属性值之外),它也会失败。
  • @Doug 我考虑过这一点,但这里有一个来自我的函数的部分谷歌检索示例:(//ssl.gstatic.com/gb/images/b8_3615d64d.png) 我最初的计划是是找到每个子字符串并返回到一个 / 连接但我现在看到即使这样也行不通......即使它在我的一生中都这样做了,并且难以理解我的前进方式找到每个子字符串的位置。
  • @NiklasB.:说得好。这就是为什么它被留下作为评论而不是答案:)。这里需要一个 HTML 解析器。

标签: c string substring


【解决方案1】:

这个问题的“正确”答案应该促使您使用为工作而构建的工具。聪明人写libxml之类的东西是有原因的。重新发明轮子只会让事情变得更加困难。例如,使用libxml,您可以轻松地遍历 XML 树,如下所示:

for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
    if (cur_node->type == XML_ELEMENT_NODE) {
        printf("node type: Element, name: %s\n", cur_node->name);
}

“错误”的答案是想出一些“技巧”来查找图像字符串的开头,或者通过查找图像标记的开头 (<img) 或引用 ",正如 Doug 提到的那样在 cmets 中。

您会注意到我在引文中指出了正确和错误。我是个纯粹主义者,强烈建议使用面向 XML 的解决方案,因为它完全通用且易于扩展(明天您可能会说:哦,我还需要锚文本)。 DOM 解析器可以轻松解决每个后续问题。

但是,如果您正在做一个概念验证或原型(甚至可能是家庭作业),并且您没有在野外发布您的代码,那么“错误”的方法可能就足够了。

【讨论】:

  • 哇,没想到libxml可以这么简单的使用。很棒的示例代码。
  • 我只是在写一些代码,只是为了入门并测试我写的一些函数,我不需要重新发明轮子,而且 libxml 看起来可能是一个可靠的解决方案.
猜你喜欢
  • 2021-02-02
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2011-02-03
相关资源
最近更新 更多