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

Posted

技术标签:

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

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

比如我有这个标签

 <a href="http://chat.***.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。 【参考方案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;

【讨论】:

以上是关于从字符串中提取 HTML 标记名称的主要内容,如果未能解决你的问题,请参考以下文章

从包含在 HTML 标记和不带标记的字符串中的一系列字符串中提取文本

从字符串中删除 HTML 标记(R 编程)

从字符串 C++ 中提取某些整数

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

如何从javascript中的字符串中提取参数(指定的模式字符串)

POEdit 不提取 HTML 标记中的字符串