php RegEx -如何在文件扩展名前插入字符串

vof42yt1  于 2023-02-21  发布在  PHP
关注(0)|答案(8)|浏览(111)

如何将“_thumb”插入到动态生成的文件中?
例如,我有一个网站,允许用户上传一张图片。脚本获取图片,优化它并保存到文件。我如何让它插入字符串“_thumb”为优化后的图片?
我目前正在保存1个版本的otpimized文件. ch-1268312613-photo.jpg
我希望将原始文件保存为上述字符串,但希望附加“_thumb”,如以下字符串ch-1268312613-photo_thumb. jpg

cvxl0en2

cvxl0en21#

不需要使用regex。下面的代码就可以了:

$extension_pos = strrpos($filename, '.'); // find position of the last dot, so where the extension starts
$thumb = substr($filename, 0, $extension_pos) . '_thumb' . substr($filename, $extension_pos);
5sxhfpxr

5sxhfpxr2#

与其使用正则表达式(或其他粗糙的字符串操作),不如使用一些与文件名相关的函数:即pathinfo(得到文件扩展名)和basename(得到文件名减去扩展名)。

$ext   = pathinfo($filename, PATHINFO_EXTENSION);
$thumb = basename($filename, ".$ext") . '_thumb.' . $ext;
  • 编辑 *:@tanascius抱歉非常相似的答案,我想我应该在写这篇文章的时候检查一下弹出的小窗口(花了一段时间,我分心了)。
au9on6nz

au9on6nz3#

为什么要使用RegEx?扩展名总是.jpg吗?是否只有一个扩展名?也许可以用_thumb.jpg替换它?
如果不是那么简单,你可以使用pathinfo这样的函数来提取basename + extension并在那里进行替换,这也不需要正则表达式,在这里可能有点过头了:

$info = pathinfo( $file );
$no_extension =  basename( $file, '.'.$info['extension'] );
echo $no_extension.'_thumb.'.$info['extension']
z8dt9xmd

z8dt9xmd4#

假设在字符串中只出现一次“.jpg”,则可以执行str_replace而不是regex

$filename = str_replace(".jpg", "_thumb.jpg", $filename);

或者更好的是substr_replace,将字符串插入中间的某个位置:

$filename = substr_replace($filename, '_thumb', -4, 0);
ndh0cuux

ndh0cuux5#

preg_replace("/(\w+)\.(\w+)/","'\\1_thumb.\\2'","test.jpg");

我认为使用正则表达式速度更快,灵活性更好。
但我承认查德的解决方案优雅而有效

8fsztsew

8fsztsew6#

$str = "ch-1268312613-photo.jpg";
print preg_replace("/\.jpg$/i","_thumb.jpg",$str);
tp5buhyn

tp5buhyn7#

这是快速的并且可以正确地显示它,

/**
* 增加後綴字至檔名後方
* Add suffix to a file name
* 
* @example suffixFileName("test.tar.gz", '_new'); //it will retrun "test.tar_new.gz"
* @version 2023.02.20 Jwu
* @param string $fullPath filename
* @param string $suffix   insert String Before File Extension
*
* @return string new file path
*/
function suffixFileName($fullPath, $suffix = "_thumb"){
    $pos = strrpos($fullPath, ".");
    if ($pos === false) {
        return $fullPath . $suffix;
    }else{
        //$filenameWithoutExt = substr($fileName, 0, -(strlen($pos) + 2));
        return substr_replace($fullPath, $suffix, $pos, 0);
    }
}

测试演示:

// Unit Test
function output($n){
    print_r($n);
    print_r('<br>');
    print_r(suffixFileName($n, "_thumb"));
    print_r('<hr>');
}
$testFiles = array(
    'C:\Jwu\TestPictures\sample.jpg',
    'TestPictures\this.is.a.jpg',
    'sample.tar.gz',
    '1.jpg',
);
array_map('output', $testFiles);

输出:

C:\Jwu\TestPictures\sample.jpg
C:\Jwu\TestPictures\sample_thumb.jpg

TestPictures\this.is.a.jpg
TestPictures\this.is.a_thumb.jpg

sample.tar.gz
sample.tar_thumb.gz

1.jpg
1_thumb.jpg
crcmnpdw

crcmnpdw8#

假设你想在第一个出现的点之前插入子字符串,preg_replace()是一种直接的技术。在模式中使用字符串锚点的开始和取反的字符类,最多只能有一个替换。因为\K重新开始整个字符串匹配,替换字符串只替换匹配的文本点。
代码:(Demo

$strings = [
    "ch-1268312613-photo.jpg",
    "foo.inc.php",
    ".htaccess",
    "no_ext",
];

var_export(
    preg_replace(
        '~^[^.]*\K\.~',
        '_thumb.',
        $strings
    )
);

输出:

array (
  0 => 'ch-1268312613-photo_thumb.jpg',
  1 => 'foo_thumb.inc.php',
  2 => '_thumb.htaccess',
  3 => 'no_ext',
)

只是为了好玩,下面的两次通话技巧也很有效:(Demo

echo implode('_thumb.', explode('.', $string, 2));

以及

echo implode('_thumb', sscanf($string, '%[^.]%s'));

相关问题