我想从带有属性的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";
}
我的代码出了什么问题?
答案 0 :(得分:4)
您的正则表达式与新行不匹配。你必须使用s
标志(单行),但由于你的正则表达式是贪婪的,它也不会起作用,我也会删除锚点,因为它可能是同一行中的几个标签。
你可以使用这样的正则表达式:
<(\w+)\s+\w+.*?>
<强> Working demo 强>
支持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;