【发布时间】:2016-06-27 14:49:53
【问题描述】:
这个问题是以下帖子的后续问题: Javascript regex: Find all URLs outside <a> tags - Nested Tags
我发现代码:
\b((https?|ftps?):\/\/[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)
与像这样为http 和ftp 部分单独执行它相比,效率极低:
\b(https?:\/\/[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)
和
\b(ftps?:\/\/[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)
以下是 regex101.com 上的示例:
- 第一种方法 - 6395 steps
- 第二种方法 - 3393 steps + 863 steps
但是,在我的一个 HTML 页面中,这些代码比较为 85628 步与 7258 + 795 步,这太疯狂了。
据我所见,使用(x|y) 模式会减少执行时间,但这里可能出于一个奇怪的原因,否则会这样。
任何帮助将不胜感激。
【问题讨论】:
-
样本数据中的最后一个链接怎么样?它是
<a...</a>。但是,您可以将前瞻放在正则表达式的固定部分之后以减少步骤。试试\b(?:htt|ft)ps?:\/\/(?![^<>]*>|[^"]*?<\/a)[^"<\s]+。更好的方法是使用this trick 匹配您不想要的但捕获您需要的:<a\s[\s\S]*?<\/a>|<[^>]+>|\b((?:htt|ft)ps?:\/\/[^"<\s]+)。顺便说一句,Javascript 正则表达式不支持原子组。
标签: javascript html regex hyperlink multipart-alternative