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

发布于 2024-07-08 15:17:57 字数 376 浏览 8 评论 0原文

我正在尝试制作一个仅返回 标记 hrefs 的正则表达式

为什么此正则表达式返回包括

(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
<link rel="stylesheet" rev="stylesheet" href="idlecore-tidied.css?T_2_5_0_228" media="screen">
<a href="anotherurl">Slash Boxes&lt;/a>

Im trying to craft a regex that only returns <link> tag hrefs

Why does this regex return all hrefs including <a hrefs?

(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
<link rel="stylesheet" rev="stylesheet" href="idlecore-tidied.css?T_2_5_0_228" media="screen">
<a href="anotherurl">Slash Boxes</a>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

邮友 2024-07-15 15:17:57

主要

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

区别是 [^<>]*?

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

不是 .*?。 这是因为您不希望它继续搜索其他标签。

Either

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

or

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

The main difference is [^<>]*? instead of .*?. This is because you don't want it to continue the search into other tags.

温柔女人霸气范 2024-07-15 15:17:57

避免这种简单情况的后向查找,只需匹配您需要的内容,并捕获您想要获得的内容。

我在 The Regex Coach 中使用 s 得到了很好的结果 ]*(href\s*=\s*(['"]).*?\2)和 g 选项。

Avoid lookbehind for such simple case, just match what you need, and capture what you want to get.

I got good results with <link\s+[^>]*(href\s*=\s*(['"]).*?\2) in The Regex Coach with s and g options.

长安忆 2024-07-15 15:17:57
/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/

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

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

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

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

i'm a little shaky on the back-references myself, so I left that in there. This regex though:

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

...works in my Javascript test.

满意归宿 2024-07-15 15:17:57
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+

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

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

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

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

您的匹配项将位于捕获的组 1 中。

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

works with Expresso (I think Expresso runs on the .NET regex-engine). You could even refine this a bit more to match the closing ' or
":

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

Perhaps your regex-engine doesn't work with lookbehind assertions. A workaround would be

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

Your match will then be in the captured group 1.

狂之美人 2024-07-15 15:17:57

你使用什么正则表达式风格? Perl 就是其中之一,不支持可变长度lookbehind。 如果有这个选项,我会选择(经过编辑以实现 MizardX 的好主意):

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

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

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

\1 将包含您的匹配项。

What regex flavor are you using? Perl, for one, doesn't support variable-length lookbehind. Where that's an option, I'd choose (edited to implement the very good idea from MizardX):

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

as a first approximation. That way the choice of quote character (' or ") will be matched.
The same for a language without support for (variable-length) lookbehind:

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

\1 will contain your match.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文