正则表达式仅返回“链接”标签的“href”属性?

Posted

技术标签:

【中文标题】正则表达式仅返回“链接”标签的“href”属性?【英文标题】:RegEx to return 'href' attribute of 'link' tags only? 【发布时间】:2010-09-21 01:35:32 【问题描述】:

我正在尝试制作一个仅返回 <link> 标签 hrefs 的正则表达式

为什么这个正则表达式会返回所有的href,包括 (? 斜线框

谢谢

【问题讨论】:

请重新表述问题。我认为没有人会理解你的问题。 【参考方案1】:

要么

/(?<=<link\b[^<>]*?)\bhref=\s*=\s*(?:"[^"]*"|'[^']'|\S+)/

/<link\b[^<>]*?\b(href=\s*=\s*(?:"[^"]*"|'[^']'|\S+))/

主要区别是[^&lt;&gt;]*? 而不是.*?。这是因为您不希望它继续搜索其他标签。

【讨论】:

太棒了!我永远不会选择那个!【参考方案2】:

避免对这种简单的情况进行后视,只需匹配您需要的内容,然后捕获您想要获得的内容。

我在带有 s 和 g 选项的 Regex Coach 中使用 &lt;link\s+[^&gt;]*(href\s*=\s*(['"]).*?\2) 获得了不错的结果。

【讨论】:

【参考方案3】:
/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/

我自己对反向引用有点不稳定,所以我把它留在了那里。不过这个正则表达式:

/(<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/

...在我的 javascript 测试中有效。

【讨论】:

【参考方案4】:
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+

适用于Expresso(我认为 Expresso 在 .NET 正则表达式引擎上运行)。您甚至可以进一步改进它以匹配结束 '":

(?<=<link\s+.*?)href\s*=\s*([\'\"])[^\'\"]+(\1)

也许您的正则表达式引擎不适用于后向断言。解决方法是

(?:<link\s+.*?)(href\s*=\s*([\'\"])[^\'\"]+(\2))

您的比赛将在被捕获的第 1 组中。

【讨论】:

【参考方案5】:

您使用的是什么正则表达式风格?一方面,Perl 不支持可变长度的lookbehind。如果这是一个选项,我会选择(编辑以实现 MizardX 的非常好的想法):

(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1

作为第一个近似值。这样引号字符('或“)的选择将被匹配。 对于不支持(可变长度)lookbehind 的语言也是如此:

(?:<link\b[^<>]*?)(href\s*=\s*(['"])(?:(?!\2).)+\2)

\1 将包含您的匹配项。

【讨论】:

以上是关于正则表达式仅返回“链接”标签的“href”属性?的主要内容,如果未能解决你的问题,请参考以下文章

js 正则验证正整数

js验证正整数

使用正则表达式替换仅保留正斜杠和数字

用C#怎么提取a标签的超链接?

C#当中如何使用正则表达式获取某一标签的所有属性 属性数量不确定

正则表达式 判断是否数字 js