3

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

为什么这个正则表达式会返回包括 <a hrefs 在内的所有 hrefs?

    (?<=<链接\s+.*?)href\s*=\s*[\'\"][^\'\"]+
    <link rel="stylesheet" rev="stylesheet"
    href="idlecore-tided.css?T_2_5_0_228" media="screen">
    <a href="anotherurl">斜线框</a>

谢谢你

4

5 回答 5

3

任何一个

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

或者

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

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

于 2008-11-06T11:54:36.427 回答
1

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

<link\s+[^>]*(href\s*=\s*(['"]).*?\2)在带有 s 和 g 选项的 Regex Coach 中取得了不错的成绩。

于 2008-11-06T12:44:01.413 回答
0
/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/

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

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

...适用于我的 Javascript 测试。

于 2008-11-06T11:30:09.610 回答
0

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

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

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

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

\1 将包含您的匹配项。

于 2008-11-06T11:37:43.590 回答
0
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+

Expresso一起使用(我认为 Expresso 在 .NET 正则表达式引擎上运行)。您甚至可以进一步改进它以匹配关闭'"

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

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

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

然后,您的比赛将在捕获的第 1 组中。

于 2008-11-06T11:38:11.763 回答