图像通用文件扩展名的正则表达式是啥样的?
Posted
技术标签:
【中文标题】图像通用文件扩展名的正则表达式是啥样的?【英文标题】:What would a regex for common file name extensions for images look like?图像通用文件扩展名的正则表达式是什么样的? 【发布时间】:2011-05-07 21:21:05 【问题描述】:我正在开始制作图片,所以图片会变成小缩略图。
但我需要一个正则表达式来检查它是否包含*.jpg, *.jpeg, .*png, *.gif
如何做到这一点?
【问题讨论】:
Karem,您需要回答一些重要问题才能获得正确的解决方案……您认为为什么需要这个正则表达式? ~~ 你用的是什么语言或软件? ~~ 如果我将一个非图像文件重命名为 fake.jpg,你的缩略图转换器会做什么? @Peter buyon,我正在使用 php,我正在尝试这样做,它会通过您输入的 url 显示图像的一点 sn-p。这很糟糕吗? 仅仅因为某些东西具有 .jpg(或其他)的扩展名,并不意味着它实际上是 jpeg - 特别是如果您通过网络接受内容。如果您只检查扩展程序,恶意用户可能会向您提供一个使服务器崩溃(或更糟)的假 jpeg。我不能给出具体的 PHP 示例,但基本上对于 jpeg,您检查前四个字节是“FFD8”,后四个字节是“FFD9”,然后您可能得到了一个有效的图像 - 其他示例 @987654321 @ 你刚刚描述的东西,这是否也需要在我的个人资料图片上传中检查(与这个问题无关),现在我的图片上传只检查扩展名,如果它是常见的就继续图片.. 感谢您的链接,我可以在不保存图片的情况下查看吗? 我会问一个关于这个的新问题。感谢您扩展我的知识。 【参考方案1】:\.(?:jpe?g|png|gif)\b
如果测试字符串包含 .jpeg
、.png
或其他选项之一,则匹配。
\.(?:jpe?g|png|gif)$
如果测试字符串以.jpeg
、.png
等结尾,则匹配。
【讨论】:
(?:)
和 \b
是干什么用的?
@Brad ?:
非捕获组(因为我们没有使用任何扩展名),\b
边界(因为我们不想匹配 look at my .gifs
)
根据正则表达式引擎,还可以考虑像 (?<=\S)
或 (?<=[\w-])
这样的回溯,以确保您没有“我上传了 .jpg”或“我搜索了 *.jpg”之类的内容"等等。
@Peter,但您假设文件名不是实际上 I uploaded the .jpg
,它在技术上可能是。 OP 需要提供更多背景信息。
好点。重新阅读这个问题,我实际上认为 OP 正在尝试基于扩展名进行 mime 类型检查(而不是检查文件的前 4/8 个字节)。【参考方案2】:
匹配图像的整个文件名
(^|\s+).+\.(jpe?g|png|gif|tiff)(\s+|$)
*注意:^
和 $
匹配字符串的开头和结尾,因此如果您要从一些较大的文本中提取名称,请删除这些字符。通过添加space
的字符串终止符(^
或$
)选项,文件名必须出现在字符串或 的开头/结尾处,并且两侧有空格。由于文件名中允许使用空格,因此这可能/可能不适用于 OP,但是,我们没有太多关于他计划使用该表达式的上下文的信息。
为了防止文件名只是一个点:
^.?[^\.]+\.(jpe?g|png|gif|tiff)$
【讨论】:
为什么是^.+
? \.(jpe?g|png|gif|tiff)$
相同。
前导点加号确保您不会匹配带有 only 扩展名的文件,即以点开头的文件,例如 name=".jpg"
。但是,..jpg
仍然有效。
这只会在扩展名位于字符串末尾时匹配 - @Karem 要求在字符串中找到 anywhere 的正则表达式(“包含”)。这可能不是他的意思,但谁知道呢?
@tchrist 对不起,你是对的。 ^.*
应该是相同的,而不是 ^.+
。哎呀。
@Brad:没错,我们可以合理地假设匹配总是在最后。但我想指出这个假设,至少应该提到这个正则表达式的真正作用。如果您确实删除了$
,您可能应该将其替换为\b
。虽然这只是另一个假设,即 OP 不希望 .tiffany
匹配:)【参考方案3】:
您不需要为此设置正则表达式...
但如果你真的想要一个正则表达式,你可以使用
(jpeg|png|gif|jpg)$
应该会成功的。
我建议你使用 substr,它会运行得更快。
编辑
添加一个句点来检查扩展名,而不仅仅是名称的结尾(或更长的扩展名),例如myjpg
或 otherfile.xgif
:
\.(png|gif|jpe?g)$
【讨论】:
不要微优化。如果足够多的替代方案编译成一个快速的 trie 数据结构,substr
将不会运行得更快,这在现代 perls 中会发生。
这不符合 OP 的要求。以上是关于图像通用文件扩展名的正则表达式是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章