Javascript 正则表达式:查找 <a> 标签之外的所有 URL - 嵌套标签

Kla*_*nis 3 html javascript regex nested hyperlink

我已经构建了这个正则表达式代码:

((https?|ftps?):\/\/[^"<\s]+)(?![^<>]*?>|[^<>]*?<\/)
Run Code Online (Sandbox Code Playgroud)

第一组捕获 HTML 中的所有链接,第二组是否定前瞻,以排除标记内的任何部分作为属性以及标记内的任何部分作为内容。

我希望只<a>排除标签 - 因此解决方案可能是仅将最后一项修改为:

[^<>]*?<\/a>
Run Code Online (Sandbox Code Playgroud)

但现在如果我有嵌套标签,例如<b></b><a>.

这是我正在处理的示例:https://regex101.com/r/lM3hC5/6(应该是 10 个匹配项)。

负向预测对我来说仍然很棘手。我认为以下内容应该有效,但事实并非如此:

(?!<a.+?<\/a>)
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/hT1cG5/1

这些是对我有帮助的最后讨论:

Kla*_*nis 6

事实证明,最好的解决方案可能如下:

((https?|ftps?):\/\/[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)
Run Code Online (Sandbox Code Playgroud)

看起来,只有当负前视以量词而不是字符串开头时,它才能正常工作。对于这种情况,实际上我们只能进行回溯。

再次强调,我们只是想确保 HTML 标签内的属性不会被弄乱。</a然后我们从第一个符号开始回溯"(因为它不是有效的 URL 符号,但<>符号带有嵌套标签)。

现在,标签内的嵌套标签也<a>可以正确找到。当然,该代码并不完美,但它应该适用于几乎所有简单的 HTML 标记。只是您可能需要小心一点:

  • 在标签内放置引号<a>
  • 不要在<a>没有任何属性(占位符)的标签上使用此算法;
  • 并且您可能需要避免使用多个嵌套标签/行,除非标签内的 URL<a>位于任何双引号之后。


这是一个非常好的但混乱的示例(不应该找到最后一个匹配项,但它确实找到了):

https://regex101.com/r/pC0jR7/2

遗憾的是,这种前瞻不起作用:(?!<a.*?<\/a>)