首页 > 解决方案 > 正则表达式匹配不被引号包围的 URL

问题描述

我有这个正则表达式:

/(?!")(https?:\/\/\S*\.(?:gif|jpg|jpeg|tiff|png|svg|webp)(\?([\w=&_%\-]*))?)(?!")/gi

匹配图像 url like http://example.com/image.png,但如果 url 被引号包围,则不匹配",例如<a href="http://example.com/image.png"></a>不匹配。


现在我有一个特殊情况:

<a href="https://i.gifer.com/Vs5X.gif"></a>

通常它不应该匹配(因为被引号包围),但是因为域名包含.gif,它仍然匹配https://i.gif.


是否可以使这个正则表达式匹配https://i.gifer.com/Vs5X.gif但不匹配<a href="https://i.gifer.com/Vs5X.gif"></a>(因为被引号包围)?


例如:

<a href="https://i.gifer.com/Vs5X.gif"></a>
-> should NOT match

foo https://i.gifer.com/Vs5X.gif bar
-> should match: https://i.gifer.com/Vs5X.gif

<a href="https://google.com/image.gif"></a>
-> should NOT match

foo https://google.com/image.gif bar
-> should match: https://google.com/image.gif

标签: javascriptregex

解决方案


您的第一个前瞻构造不应该存在。由于大多数浏览器还不支持lookbehinds,你最好这样做:

"[^"]*"|(https?:\/\/[^\/\s]+\/\S+\.(?:gif|jpe?g|tiff|png|svg|webp))\b

这样您就可以在第一个捕获组中获得所需的匹配。

在此处查看现场演示


推荐阅读