正则表达式以匹配没有用引号引起来的URL

时间:2018-08-31 08:59:56

标签: javascript regex

我有这个正则表达式:

/(?!")(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

3 个答案:

答案 0 :(得分:2)

您的第一个前瞻构造不应该存在。由于大多数浏览器尚不支持向后搜索,因此您最好执行以下操作:

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

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

请参见live demo here

答案 1 :(得分:-1)

您可以在文件扩展名后使用单词边界匹配\b

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

请参见Using Special Characters

答案 2 :(得分:-2)

您可能需要添加^(匹配输入的开头)和$(匹配输入的结尾)。我确信以下类似内容对您有用:

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