我已经构建了这个正则表达式代码:
((https?|ftps?):\/\/[^"<\s]+)(?![^<>]*?>|[^<>]*?<\/)
第一组捕获 HTML 中的所有链接,第二组是否定前瞻,将标签内的任何部分排除为属性,并将标签内的任何部分排除为内容。
我只想要<a>
标签被排除在外 - 因此解决方案可能是仅将最后一项修改为:
[^<>]*?<\/a>
但是现在如果我有嵌套的标签就会有问题,比如<b></b>
里面<a>
.
这是我正在处理的示例:https://regex101.com/r/lM3hC5/6 (应该是 10 场比赛)。
负前瞻对我来说仍然很棘手。我认为以下应该有效,但事实并非如此:
(?!<a.+?<\/a>)
https://regex101.com/r/hT1cG5/1
这些是对我有帮助的最后讨论:
最佳答案
事实证明,最好的解决方案可能如下:
((https?|ftps?):\/\/[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)
看起来负先行只有在以 quantifiers 开头时才能正常工作而不是字符串。对于这种情况,实际上我们只能进行回溯。
同样,我们只是想确保 HTML 标签内的任何内容都不会被弄乱。然后我们从</a
开始回溯。到第一个 "
符号(因为它不是有效的 URL 符号,但 <>
符号出现在嵌套标签中)。
现在还在 <a>
中嵌套了标签正确找到标签。当然,代码并不完美,但它应该适用于几乎所有简单的 HTML 标记。只是您可能需要小心一点:
- 在
<a>
内放置引号标签; - 不要在
<a>
上使用此算法没有任何属性的标签 ( placeholders ); - 以及您可能需要避免使用多个嵌套标签/行,除非 URL 在
<a>
内标记在任何双引号之后。
这是一个非常好的和困惑的例子(最后一个匹配不应该找到,但它是):
https://regex101.com/r/pC0jR7/2
很遗憾,这个前瞻不起作用:(?!<a.*?<\/a>)
关于Javascript 正则表达式 : Find all URLs outside <a> tags - Nested Tags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35553751/