从字符串中提取HTML标记名

从字符串中提取HTML标记名,html,regex,perl,html-parsing,Html,Regex,Perl,Html Parsing,我想从带有属性的HTML标记中提取标记名 例如,我有这个标签 <a href="http://chat.stackoverflow.com" class="js-gps-track" data-gps-track="site_switcher.click({ item_type:6 })" > 我的代码怎么了?您的正则表达式与新行不匹配。您必须使用s标志(单行),但由于您的正则表达式贪婪,因此也无法工作,而且我会删除锚,因为它可能是同一行中的多个标记 您可以使用这样的正则

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

例如,我有这个标签

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

我的代码怎么了?

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

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

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

支持Borodin的评论,您不应该使用正则表达式解析html,因为您可能会面临解析问题。您可以使用正则表达式来解析简单的标记,就像您所拥有的一样,但是如果您有带有嵌入式标记的文本,如
,则很容易破坏这种情况,在这种情况下,正则表达式将只匹配标记
a


这个正则表达式背后的思想是强制标签至少有一个属性,您也可以尝试以下方法:;它将匹配标签名(始终)
+
属性(如果属性存在)

\(?name>\w+(?attributes>\s+[^\>]*|)\>

让matchTagName=(标记)=>{
常量模式=/]+)(\s |>)+/
返回markup.match(模式)[1]
}
匹配标记名(“”/“测试”
匹配标记名(“”/“测试”
匹配标记名(“”/“测试虚线”

这句话已经说过一千遍了,但显然需要重复:不要使用正则表达式来处理XML/HTML。对于HTML,我会选择,因为它可以原谅在现实世界中发现的那种格式错误的HTML。
<(\w+)\s+\w+.*?>
let matchTagName = (markup) => {
  const pattern = /<([^\s>]+)(\s|>)+/
  return markup.match(pattern)[1]
}

matchTagName("<test>") // "test"
matchTagName("<test attribute>") // "test"
matchTagName("<test-dashed>") // "test-dashed"