从字符串中提取HTML标记名称

时间:2015-03-10 22:18:20

标签: 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 })"
>

我需要提取标记名a

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

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

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:4)

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

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

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

<强> Working demo

enter image description here

支持Borodin的评论,你不应该使用正则表达式解析html,因为你可能面临解析问题。您可以使用正则表达式来解析简单标记,但如果您的文本包含<a asdf<as<asdf>df>>等嵌入标记,则可以很容易地将其解析,在这种情况下,正则表达式将与标记a

匹配

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

答案 1 :(得分:3)

let matchTagName = (markup) => {
  const pattern = /<([^\s>]+)(\s|>)+/
  return markup.match(pattern)[1]
}

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

答案 2 :(得分:0)

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

\≤(?&LT;名称&gt; \ W +)(?&LT;属性&GT; \ S + [^&GT;] * |)&GT;