javascript - 正则表达式对少数 URL 失败
问题描述
我有一个正则表达式/url\s*\((?!['("]?(?:data):)['"]?([^')"\)]*)['"]?([\)]|$)/gi
,我们使用它来解析样式标签以获取 URL(ex.backgroundImage)。URL 失败,例如
1]background-image: url(\2f content\2f dam\2f dx\2fus\2f en\2f error-pages\2f 404-1440x612_edge2.jpg\2fjcr%3acontent\2frenditions\2f cq5dam.tablet_1400.1400.595.jpg); background-position: 50% 50%;
应该是 =>url(\2f content\2f dam\2f dx\2fus\2f en\2f error-pages\2f 404-1440x612_edge2.jpg\2fjcr%3acontent\2frenditions\2f cq5dam.tablet_1400.1400.595.jpg)
2]背景图像:url("https://www.investopedia.com/thmb/m3EwtlYfbUhlr9e34AofFj9wok8=/1300x0/filters:contrast(10):brightness(-10):no_upscale()/TopTerms-2bdc464d466944deb41fc07379407600.jpeg")
应该是 =>url("https://www.investopedia.com/thmb/m3EwtlYfbUhlr9e34AofFj9wok8=/1300x0/filters:contrast(10):brightness(-10):no_upscale()/TopTerms-2bdc464d466944deb41fc07379407600.jpeg")
它在 contrast(10) 处失败:因为它将 contrast(10) 右括号视为 URL 的结尾。
3]background-image:url('https://cdn.comcast.com/-/media/Images/www_xfinity_com/TV/X1/09072021 Refresh/10X1HeroDesktop.png?rev=d04c61c0-3658-457d-8260-74ef6694c0ed&mw=1280&mh=600&hash=6A1C4FEC8499EE38864BA31D24B9E42220D8C7EB')" background-size: cover;
应该是 =>url('https://cdn.comcast.com/-/media/Images/www_xfinity_com/TV/X1/09072021 Refresh/10X1HeroDesktop.png?rev=d04c61c0-3658-457d-8260-74ef6694c0ed&mw=1280&mh=600&hash=6A1C4FEC8499EE38864BA31D24B9E42220D8C7EB')
4]style="position:absolute; background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=) repeat 0 0"
应该是 =>url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=)
解决方案
您可以使用交替|
来获得不同的格式。
url\s*\((?:data:image\S+|(['"]).*?\1|[^()]*)\)
在部分情况下,模式匹配:
url\s*\(
匹配 url,可选空格字符(
(?:
轮换的非捕获组data:image\S+
匹配数据:图像和 1+ 个非空白字符|
或者(['"]).*?\1
从开始报价到结束报价匹配|
或者[^()]*
匹配除括号外的任何字符 0+ 次
)
关闭非捕获组\)
匹配)
推荐阅读
- python-3.x - Good practice to implement a ThreadPool of intensive processing inside a Django App
- java - simulate touch events on Android
- reactjs - React Testing onClick Console.log
- c# - R1C1-formulas in Gembox.Spreadsheet
- python - 如何根据模糊条件从 Numpy 数组中选择值?
- macos - Powerpoint 的官方文档 AppleScript 命令在哪里?
- omnet++ - INET wlan[0].radio 中的无线 NeSTiNg 主机:“接收开始:未尝试”
- amazon-web-services - 为不同用户使用不同权限保护 AWS S3 中文件的最佳方法是什么?
- python - 每 11 秒填充一次时间戳间隔
- java - 无法从 Map.Entry 转换
到字符串