首页 > 解决方案 > 正则表达式排除带有奇怪 URL 的链接

问题描述

我有这个正则表达式(Java / JavaScript)

/(http|ftp|https):\/\/([\w+?\.\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\-\\=\\+\\\\\/\\?\\.\\:\\;\\'\\,]*\.(?:jpg|JPG|jpeg|JPEG|gif|GIF|png|PNG|bmp|BMP|tiff|TIFF))?/

但它似乎对这样的 URL 有问题:

https://cdn.vox-cdn.com/thumbor/C07imD1SHmAnbObkg-nJ92N6sD8=/0x0:4799x3199/920x613/filters:focal(2017x1217:2783x1983):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/62871037/seattle.0.jpg

你认为我的表达中缺少什么?我想接受有效的图片 URL。

标签: javascriptjavaregex

解决方案


您的表达式在我使用(regex101.com)测试的验证器中对我有用,但是,它匹配为 3 个单独的捕获组。要将其全部捕获为单个匹配项,只需将整个语句包装在一组括号中。

注意:要清楚,有更简单的方法可以做到这一点,但要回答 OP 提出的具体问题,这将使他们的陈述与他们提供的链接相匹配。

((http|ftp|https):\/\/([\w+?\.\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\-\\=\\+\\\\\/\\?\\.\\:\\;\\'\\,]*\.(?:jpg|JPG|jpeg|JPEG|gif|GIF|png|PNG|bmp|BMP|tiff|TIFF))?)

编辑:在协助 OP 缩小他们的问题范围后,更合适的正则表达式语句将是这样的:/^(((http(s?))|((s?)ftp)):)([\w \D~!@#$%^&*\\_/-=+/?.:;',]){1,}\.(jpg|gif|png)$/i

让我们分解一下:首先,它必须以带有可选“s”的“http”开头,或者如果不存在,它将查找带有可选“s”前缀的“ftp”,以说明安全形式FTP。这必须跟一个冒号。下一组接受 url 路径中几乎所有常用的字符或符号。最后,它确保表达式以实际的图像扩展名结束。将表达式包装在中/{expression}/i表示该表达式不区分大小写,它将以任意组合匹配大写或小写。

作为进一步说明,您可能还需要考虑 .jpeg、.tif 等的打印格式。


推荐阅读