我有这个正则表达式:
/(?!")(https?:\/\/\S*\.(?:gif|jpg|jpeg|tiff|png|svg|webp)(\?([\w=&_%\-]*))?)(?!")/gi
与http://example.com/image.png
之类的图片网址匹配,但是如果网址用引号"
包围,则不匹配,例如<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
答案 0 :(得分:2)
您的第一个前瞻构造不应该存在。由于大多数浏览器尚不支持向后搜索,因此您最好执行以下操作:
"[^"]*"|(https?:\/\/[^\/\s]+\/\S+\.(?:gif|jpe?g|tiff|png|svg|webp))\b
这样,您就可以在第一个捕获组中获得所需的匹配。
答案 1 :(得分:-1)
您可以在文件扩展名后使用单词边界匹配\b
:
/(?!")(https?:\/\/\S*\.(?:gif|jpg|jpeg|tiff|png|svg|webp)\b(\?([\w=&_%\-]*))?)(?!")/gi
答案 2 :(得分:-2)
您可能需要添加^
(匹配输入的开头)和$
(匹配输入的结尾)。我确信以下类似内容对您有用:
/^(?!")(https?:\/\/\S*\.(?:gif|jpg|jpeg|tiff|png|svg|webp)(\?([\w=&_%\-]*))?)(?!")$/gi