如何将“_thumb”插入到动态生成的文件中?例如,我有一个网站,允许用户上传一张图片。脚本获取图片,优化它并保存到文件。我如何让它插入字符串“_thumb”为优化后的图片?我目前正在保存1个版本的otpimized文件. ch-1268312613-photo.jpg我希望将原始文件保存为上述字符串,但希望附加“_thumb”,如以下字符串ch-1268312613-photo_thumb. jpg
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);
5sxhfpxr2#
与其使用正则表达式(或其他粗糙的字符串操作),不如使用一些与文件名相关的函数:即pathinfo(得到文件扩展名)和basename(得到文件名减去扩展名)。
$ext = pathinfo($filename, PATHINFO_EXTENSION); $thumb = basename($filename, ".$ext") . '_thumb.' . $ext;
au9on6nz3#
为什么要使用RegEx?扩展名总是.jpg吗?是否只有一个扩展名?也许可以用_thumb.jpg替换它?如果不是那么简单,你可以使用pathinfo这样的函数来提取basename + extension并在那里进行替换,这也不需要正则表达式,在这里可能有点过头了:
.jpg
_thumb.jpg
$info = pathinfo( $file ); $no_extension = basename( $file, '.'.$info['extension'] ); echo $no_extension.'_thumb.'.$info['extension']
z8dt9xmd4#
假设在字符串中只出现一次“.jpg”,则可以执行str_replace而不是regex
str_replace
$filename = str_replace(".jpg", "_thumb.jpg", $filename);
或者更好的是substr_replace,将字符串插入中间的某个位置:
substr_replace
$filename = substr_replace($filename, '_thumb', -4, 0);
ndh0cuux5#
preg_replace("/(\w+)\.(\w+)/","'\\1_thumb.\\2'","test.jpg");
我认为使用正则表达式速度更快,灵活性更好。但我承认查德的解决方案优雅而有效
8fsztsew6#
$str = "ch-1268312613-photo.jpg"; print preg_replace("/\.jpg$/i","_thumb.jpg",$str);
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
crcmnpdw8#
假设你想在第一个出现的点之前插入子字符串,preg_replace()是一种直接的技术。在模式中使用字符串锚点的开始和取反的字符类,最多只能有一个替换。因为\K重新开始整个字符串匹配,替换字符串只替换匹配的文本点。代码:(Demo)
preg_replace()
\K
$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'));
8条答案
按热度按时间cvxl0en21#
不需要使用regex。下面的代码就可以了:
5sxhfpxr2#
与其使用正则表达式(或其他粗糙的字符串操作),不如使用一些与文件名相关的函数:即pathinfo(得到文件扩展名)和basename(得到文件名减去扩展名)。
au9on6nz3#
为什么要使用RegEx?扩展名总是
.jpg
吗?是否只有一个扩展名?也许可以用_thumb.jpg
替换它?如果不是那么简单,你可以使用pathinfo这样的函数来提取basename + extension并在那里进行替换,这也不需要正则表达式,在这里可能有点过头了:
z8dt9xmd4#
假设在字符串中只出现一次“.jpg”,则可以执行
str_replace
而不是regex或者更好的是
substr_replace
,将字符串插入中间的某个位置:ndh0cuux5#
我认为使用正则表达式速度更快,灵活性更好。
但我承认查德的解决方案优雅而有效
8fsztsew6#
tp5buhyn7#
这是快速的并且可以正确地显示它,
测试演示:
输出:
crcmnpdw8#
假设你想在第一个出现的点之前插入子字符串,
preg_replace()
是一种直接的技术。在模式中使用字符串锚点的开始和取反的字符类,最多只能有一个替换。因为\K
重新开始整个字符串匹配,替换字符串只替换匹配的文本点。代码:(Demo)
输出:
只是为了好玩,下面的两次通话技巧也很有效:(Demo)
以及