代码之家  ›  专栏  ›  技术社区  ›  Jerod Venema

按类名提取元素的regex

  •  0
  • Jerod Venema  · 技术社区  · 15 年前

    问候语!

    我有一些HTML可能有效,也可能无效。如果HTML无效,则可以进行最佳尝试,出现的任何错误都是可以接受的(即,由于某些标记没有正确关闭,分组太多)。

    在这个HTML中有许多元素,其中一些可能有一个类(称之为“findme”)。这些元素的类型各不相同;有些 IMG 一些 对象 一些 等。

    我需要一个regex,它将拉出所有元素,以及它们包含的内容(如果它们包含内容)。

    例如:

    <div>
    <span><img class="findme" src="something" /></span>
    <object class="findme" classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50">
      <param name="BorderStyle" value="1" />
      <param name="MousePointer" value="0" />
      <param name="Enabled" value="1" />
      <param name="Min" value="0" />
      <param name="Max" value="10" />
    </object>
    </div>
    

    在该HTML块上运行regex应返回2个元素:

    <img class="findme" src="something" />
    

    <object class="findme" classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50">
          <param name="BorderStyle" value="1" />
          <param name="MousePointer" value="0" />
          <param name="Enabled" value="1" />
          <param name="Min" value="0" />
          <param name="Max" value="10" />
        </object>
    

    你们当中有人对这个有想法吗?

    编辑: 语言是C。

    5 回复  |  直到 12 年前
        1
  •  4
  •   Andrew Moore    15 年前

    虽然正则表达式可以很好地用于各种各样的任务,但我发现在解析HTMLDOM时,它通常不够。HTML的问题在于,文档的结构是如此多变,以至于很难准确地提取标签(准确地说,我的意思是100%的成功率,没有假阳性)。

    我建议您使用一个DOM解析器,例如 SimpleHTML 然后这样使用:

    require_once('SimpleHTML.class.php')
    
    $html_dom = str_get_dom($html);
    $tags = $html_dom->find('img.findme'); // Get all img elements of class findme
    

    有些人可能认为这是一种过度杀伤力,但归根结底,它将更容易维护,并且允许更多的可扩展性。例如,使用DOM解析器,我还可以获得alt属性。

    可以设计一个正则表达式来实现相同的目标,但会受到限制,从而强制 alt 属性位于 src 或者相反,为了克服这个限制,正则表达式将增加更多的复杂性。

    另外,考虑以下内容。正确匹配 <img> 使用正则表达式标记并仅获取 class 属性(在组2中捕获),需要以下正则表达式:

    <\s*img\s+[^>]*?\s*class\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>
    

    此外,如果出现以下情况,上述情况可能会失败:

    • 属性或标记名以大写字母表示,并且 i 未使用修饰符。
    • 引号不用于 属性。
    • 那么另一个属性 使用 > 在他们价值的某个地方。
    • 我没有预料到的其他原因。

    同样,不要使用正则表达式来解析DOM文档。

        2
  •  2
  •   cletus    15 年前

    regex对于这项工作来说是一个非常糟糕的工具。使用解析器。在执行此操作之前,请通过HTML整理运行它来修复无效的HTML。无论您使用什么语言(您不说),都将有一个或多个HTML解析器可用。

        3
  •  0
  •   lotsoffreetime    15 年前

    您没有提到您使用的是哪种语言,但是您可能应该将它加载到一个XML文档中,并在DOM中进行适当的搜索。正则表达式将模式匹配,但您可能会得到各种误报。

        4
  •  0
  •   flitzwald    15 年前

    试图用正则表达式来解决这类问题是除盐器的一个秘诀。如果您在服务器上工作,请使用一个容错的HTML解析器(例如,hpricot for ruby)解析代码片段,并根据DOM进行验证。 在客户端上也可以使用el.innerhtml=…”

        5
  •  0
  •   Bill the Lizard    12 年前

    而不是直接用raw解决这个问题 regex 操作,
    你应该考虑使用一些 HTML分析程序模块 你熟悉的任何一种语言。
    在这里列出一些参考资料,