PHP 正则表达式忽略以双下划线开头的文件

标签 php regex preg-match

我已经尝试过了,但我根本无法理解 PHP 中的正则表达式。我需要一个执行以下操作的正则表达式:

  • 忽略以双下划线开头的文件。 (例如 __file.jpg)
  • 忽略以“thumb”结尾的文件。 (例如 somethumb.jpg 或 thumb.jpg)
  • 忽略除 gif|jpg|png|jpeg 之外的所有文件类型

我现在有以下内容,似乎满足了#2 和#3,但没有满足#1:

preg_match(/(?<!thumb)\.(gif|jpg|png|jpeg)$/i, $file)

非常感谢任何帮助!

最佳答案

如果我对第三点的理解正确,那就意味着它应该以所有这些文件扩展名结尾。考虑到这一点,以下将起作用

第一个解决方案

(?!^__|.*thumb\.(gif|jpg|png|jpeg))(^.*)(?=\.(gif|jpg|png|jpeg)$)

Regex Demo

寻求有效的解决方案

第二个解决方案

^(?!__|.*thumb\.(?:gif|jpg|png|jpeg))(.*(?=\.(?:gif|jpg|png|jpeg)$).*$)

第三个解决方案(由 Wiktor 在评论中建议)

^(?!__|.*thumb\.(?:gif|jpg|png|jpeg))(?=.*\.(?:gif|jpg|png|jpeg)$).*

第四个解决方案(由 Casimir 在评论中建议)

^(?!__)(?:[^.\n]*\.)*+(?<!thumb\.)(?:jpe?g|png|gif)$

PHP 代码

$re = "/^(?!__|.*thumb\\.(?:gif|jpg|png|jpeg))(?=.*\\.(?:gif|jpg|png|jpeg)$)(.*)/m";
$str = "__abcd.jpg\nthumbabcd.gif\nthumbabcdthumb.jpg\nthumbs.jpg\nsomethumb.jpg\nthumb.jpg\nabcd.jpg\nabcd.jps"; 

preg_match_all($re, $str, $matches);

Ideone Demo

关于PHP 正则表达式忽略以双下划线开头的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36776571/

相关文章:

php - Sylius liip 想象 : Unable to open image

PHP imap_open() => [AUTHENTICATIONFAILED] for imap.gmail.com

php - 匹配 unicode block 或索引范围的正则表达式

正则表达式:删除除第一个字符和最后一个数字之外的所有内容

php - 使用 PHP 从(搜索引擎)引用网址获取关键字

php - preg_match 只给出一个匹配项

php - 它将数据库中 "Active"字段的所有值设置为 0

regex - 适用于 Google 文档的 Apps 脚本 findText()

php - 为什么这个正则表达式捕获会产生 2 个匹配项?

php - 循环遍历 php 中的表格以找到适合我的数据的最佳位置