我有一张图片上传表单。用户提交表单后,我的脚本将处理图像并清理图像文件名(我在文件名末尾添加一个唯一的数字系列,以防止可能的重复文件名。
我经常收到文件名(处理后),例如
"c-id-1333-l-id-1298491-aid-3951-id-13995346097186883-im-193-1.jpg"
如果数字超过5位数,我怎么能preg_replace数字,如果数字少于5位或更少,它将被保留。上面的例子应该给"c-id-1333-l-id--aid-3951-id--im-193-1.jpg"
(不要介意多个连续短划线[ - ],我的脚本可以处理这个。
答案 0 :(得分:1)
您可以使用以下方法执行此操作。
$str = 'c-id-1333-l-id-1298491-aid-3951-id-13995346097186883-im-193-1.jpg';
$str = preg_replace('/\d{5,}/', '', $str);
var_dump($str);
说明:
\d{5,} # digits (0-9) (at least 5 times)
输出:
string(41) "c-id-1333-l-id--aid-3951-id--im-193-1.jpg"
如果您想保留5
个数字或少于5个数字,那么您可以改为使用\d{6,}
。
答案 1 :(得分:0)
用户提供的名称是否重要?
如果不是,我喜欢在这种情况下标准化文件名的一种方法是简单地用sha1甚至md5之类的方法对它们进行哈希处理。然后添加你的时间戳,ids或者不是那些,这会解决文件名中特殊字符的许多问题,例如“。”,“\”和“/”(点点划线和目录遍历)。
@hwnd的正则表达式应该可以解决问题,但是我会把它扔出去。
因此,通过散列,您可以获得更清晰(但不那么有意义)的名称
da39a3ee5e6b4b0d3255bfef95601890afd80709.jpg
然后您可以在
上添加您的唯一数字da39a3ee5e6b4b0d3255bfef95601890afd80709-1234568764564558.jpg
你甚至可以先用时间戳对文件名进行加盐,然后对它们进行哈希处理以获得长度为40个字符的文件名,除非你处理成千上万的文件,否则哈希冲突的可能性非常小,在这种情况下只需要哈希到sha256等。