javascript - 正则表达式匹配不被引号包围的 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
解决方案
您的第一个前瞻构造不应该存在。由于大多数浏览器还不支持lookbehinds,你最好这样做:
"[^"]*"|(https?:\/\/[^\/\s]+\/\S+\.(?:gif|jpe?g|tiff|png|svg|webp))\b
这样您就可以在第一个捕获组中获得所需的匹配。
在此处查看现场演示
推荐阅读
- php - 无法使用 Illuminate\Support\Facades\Route 作为 Route,因为该名称已在第 3 行的 /home/laravel/routes/web.php 中使用
- python - 如何解决数据集中数据总和异常和缺失日期的问题?
- bluetooth - hcitool cc 和 hcitool auth 返回输入/输出错误
- flutter - carousel_slider(颤振包)中的“items:child”是什么意思?
- android - 无法为颤振医生找到 android SDK
- python - 将包含 xlrd 模块的文件导入其他 python 文件
- cassandra - DS201:如何在使用 Python 驱动程序插入 cassandra 时获取“type timeuuid”的值?
- wpf - Prism.DRYIoc 无法关闭 ThrowOnRegisteringDisposableTransient
- docker - 如何使用 ngnix 将请求路由到不同的 docker 容器?
- javascript - 全局数组在我的 JavaScript 程序中保留刷新数据