繁体   English   中英

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

[英]Javascript regex: Find all URLs outside <a> tags - Nested Tags

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

((https?|ftps?):\/\/[^"<\s]+)(?![^<>]*?>|[^<>]*?<\/)

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

我希望只排除<a>标签 - 因此解决方案可能只是修改最后一个术语:

[^<>]*?<\/a>

但是现在如果我有嵌套标签就会出现问题,例如<a> <b></b>

以下是我正在研究的示例: https//regex101.com/r/lM3hC5/6 (应该是10场比赛)。

消极的前瞻对我来说仍然很棘手。 我认为以下内容应该有效,但事实并非如此:

(?!<a.+?<\/a>)

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

这些是帮助我的最后一次讨论:

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

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

看起来负面预测只有在以量词而不是字符串开头时才能正常工作。 对于这种情况,实际上我们只能做回溯。

同样,我们只想确保HTML标记内的任何内容都不会被混淆。 然后我们从</a到第一个"符号开始做回溯(因为它不是有效的URL符号,但<>符号与嵌套标签一起出现)。

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

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


这是一个非常好的和混乱的例子(不应该找到最后一个匹配,但它是):

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM