正则表达式返回“href”; “链接”的属性 仅标签?
我正在尝试制作一个仅返回 标记 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>
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
主要
区别是
[^<>]*?
而不是
.*?
。 这是因为您不希望它继续搜索其他标签。Either
or
The main difference is
[^<>]*?
instead of.*?
. This is because you don't want it to continue the search into other tags.避免这种简单情况的后向查找,只需匹配您需要的内容,并捕获您想要获得的内容。
我在 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.我自己对反向引用有点犹豫,所以我把它留在那里。 不过这个正则表达式:
...在我的 Javascript 测试中有效。
i'm a little shaky on the back-references myself, so I left that in there. This regex though:
...works in my Javascript test.
与 Expresso 配合使用(我认为 Expresso 在 .NET 正则表达式引擎上运行)。 您甚至可以进一步完善它以匹配结束
'
或"
:也许您的正则表达式引擎无法使用后向断言。解决方法是
您的匹配项将位于捕获的组 1 中。
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"
:Perhaps your regex-engine doesn't work with lookbehind assertions. A workaround would be
Your match will then be in the captured group 1.
你使用什么正则表达式风格? Perl 就是其中之一,不支持可变长度lookbehind。 如果有这个选项,我会选择(经过编辑以实现 MizardX 的好主意):
作为第一个近似值。 这样,引号字符(' 或 ")的选择将被匹配。
对于不支持(可变长度)lookbehind 的语言也是如此:
\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):
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:
\1 will contain your match.