【问题标题】:Extract an HTML tag name from a string从字符串中提取 HTML 标记名称
【发布时间】:2015-05-12 13:35:34
【问题描述】:

我想从带有属性的 HTML 标记中提取标记名称。

比如我有这个标签

 <a href="http://chat.stackoverflow.com" class="js-gps-track"     data-gps-track="site_switcher.click({ item_type:6 })"
>

我需要提取标签名称a

我尝试了以下正则表达式,但它不起作用。

if ( $raw =~ /^<(\S*).*>$/ ) {
   print "$1 is tag name of string\n";
}

我的代码有什么问题?

【问题讨论】:

  • 已经说过一千遍了,但显然需要重复:不要使用正则表达式来处理 XML/HTML。对于 HTML,我会选择 HTML::TreeBuilder,因为它可以容忍在现实世界中发现的那种格式错误的 HTML。

标签: html regex perl html-parsing


【解决方案1】:

您的正则表达式与新行不匹配。您必须使用 s 标志(单行),但由于您的正则表达式是贪婪的,它也不起作用,我也会删除锚点,因为它可能是同一行中的多个标签。

您可以像这样使用正则表达式:

<(\w+)\s+\w+.*?>

Working demo

支持 Borodin 的评论,您不应该使用正则表达式来解析 html,因为您可能会遇到解析问题。您可以使用正则表达式来解析像您一样的简单标签,但如果您有带有嵌入标签(如&lt;a asdf&lt;as&lt;asdf&gt;df&gt;&gt;)的文本,这很容易被破坏,在这种情况下,正则表达式将错误地匹配标签a

这个正则表达式背后的想法是强制标签至少有一个属性

【讨论】:

    【解决方案2】:
    let matchTagName = (markup) => {
      const pattern = /<([^\s>]+)(\s|>)+/
      return markup.match(pattern)[1]
    }
    
    matchTagName("<test>") // "test"
    matchTagName("<test attribute>") // "test"
    matchTagName("<test-dashed>") // "test-dashed"
    

    【讨论】:

      【解决方案3】:

      您也可以尝试以下方法;它将匹配标签名称(始终)+ 属性(如果存在)。

      \&amp;lt;(?&amp;lt;name&gt;\w+)(?&amp;lt;attributes&gt;\s+[^\&gt;]*|)\&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-22
        • 2016-03-18
        • 2013-06-18
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 2022-08-12
        相关资源
        最近更新 更多