正则表达式只返回“link”标签的“href”属性?

3

请重新表达问题。我认为任何人都无法理解您当前的问题。 - Rexxars
5个回答

3

无论哪种方式

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

或者

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

主要区别在于[^<>]*?而不是.*?。这是因为您不希望它继续搜索其他标签。

1
避免在这种简单情况下使用后顾,只需匹配所需内容,并捕获想要获取的内容。
我在 The Regex Coach 中使用带有 s 和 g 选项的 <link\s+[^>]*(href\s*=\s*(['"]).*?\2) 获得了良好的结果。

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

我自己对反向引用还有点摸不着头脑,所以我把它留在那里了。但是这个正则表达式:

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

...在我的Javascript测试中运行。


0
你使用的正则表达式是哪种?例如,Perl 不支持变长后顾。如果有这个选项,我会选择(根据 MizardX 的好建议进行了编辑):
(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1

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

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

\1 将包含您的匹配。


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

适用于Expresso(我认为Expresso在.NET正则表达式引擎上运行)。您甚至可以进一步细化以匹配闭合的'"

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

可能你的正则表达式引擎不支持向后断言。一个解决方法是

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

你的匹配结果将在第一个捕获组中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接