从字符串中提取 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,因为您可能会遇到解析问题。您可以使用正则表达式来解析像您一样的简单标签,但如果您有带有嵌入标签(如<a asdf<as<asdf>df>>
)的文本,这很容易被破坏,在这种情况下,正则表达式将错误地匹配标签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】:您也可以尝试以下方法;它将匹配标签名称(始终)+
属性(如果存在)。
\&lt;(?&lt;name>\w+)(?&lt;attributes>\s+[^\>]*|)\>
【讨论】:
以上是关于从字符串中提取 HTML 标记名称的主要内容,如果未能解决你的问题,请参考以下文章
从包含在 HTML 标记和不带标记的字符串中的一系列字符串中提取文本
构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]