Javascript 正则表达式 : Find all URLs outside <a> tags - Nested Tags

标签 javascript html regex hyperlink nested

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

((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/

相关文章:

javascript - 如何使新的 DOM 元素认为它驻留在与 js 和 css 不同的域中

javascript - 如何使用 Jquery 淡出一个按钮

c# - 如果后面跟着任何字母,如何使用正则表达式删除单独的 1?

regex - 仅替换标题中的字符

javascript - 带有标签的 Twitter Bootstrap 下拉列表

Javascript 匹配任何内容直到模式

javascript - 使用 javascript 创建 `select` 元素

javascript - Meteor wrapAsync/Node Fiber Future 不工作

javascript - AngularJS:将服务注入(inject)指令?

html - CSS 从左上角开始缩放