繁体   English   中英

PHP (preg_replace) 正则表达式从文件名中剥离图像大小

[英]PHP (preg_replace) regex strip image sizes from filename

我正在为 WordPress 开发一个开源插件,坦率地说,我遇到了一个奇怪的问题。

考虑以下文件名:

/wp-content/uploads/buddha_-800x600-2-800x600.jpg
/wp-content/uploads/cutlery-tray-800x600-2-800x600.jpeg
/wp-content/uploads/custommade-wallet-800x600-2-800x600.jpeg
/wp-content/uploads/UI-paths-800x800-1.jpg

我目前的正则表达式:

(-[0-9]{1,4}x[0-9]{1,4}){1}

这将从文件名中删除两个匹配项,例如buddha_-800x600-2-800x600.jpg将变为无效的 buddha_-2.jpg

我尝试了多种正则表达式:

.*(-\d{1,4}x\d{1,4}) // will trip out everything
(-\d{1,4}x\d{1,4}){1}|.*(-\d{1,4}x\d{1,4}){1} // same as above
(-\d{1,4}x\d{1,4}){1}|(-\d{1,4}x\d{1,4}){1} // will strip out all size matches

不幸的是,我对正则表达式的了解非常有限,有人可以建议如何实现目标吗?

目标是只删除相关的内容,这将导致:

/wp-content/uploads/buddha_-800x600-2.jpg
/wp-content/uploads/cutlery-tray-800x600-2.jpeg
/wp-content/uploads/custommade-wallet-800x600-2.jpeg
/wp-content/uploads/UI-paths-1.jpg

非常感激!

您可以使用带有反向引用的捕获组来匹配具有 2 个相同部分的字符串,并将其替换为单个部分。

或匹配要删除的尺寸。

((-\d+x\d+)-\d+)\2|-\d+x\d+
  • (捕获组 1
    • (-\d+x\d+)捕获组 2 ,匹配- 1+ 数字x和 1+ 数字
    • -\d+匹配 - 和 1+ 位
  • )\2关闭第 2 组,然后是对第 1 组中捕获的内容的反向引用
  • | 或者
  • -\d+x\d+匹配维度格式

正则表达式演示| Php演示

例如

$pattern = '~((-\d+x\d+)-\d+)\2|-\d+x\d+~';
$strings = [
    "/wp-content/uploads/buddha_-800x600-2-800x600.jpg",
    "/wp-content/uploads/cutlery-tray-800x600-2-800x600.jpeg",
    "/wp-content/uploads/custommade-wallet-800x600-2-800x600.jpeg",
    "/wp-content/uploads/UI-paths-800x800-1.jpg",
];

foreach ($strings as $s) {
    echo  preg_replace($pattern, '$1', $s) . PHP_EOL;
}

Output

/wp-content/uploads/buddha_-800x600-2.jpg
/wp-content/uploads/cutlery-tray-800x600-2.jpeg
/wp-content/uploads/custommade-wallet-800x600-2.jpeg
/wp-content/uploads/UI-paths-1.jpg

我会尝试这样的事情。 你可以自己测试一下。 这是代码:

$a = [
     '/wp-content/uploads/buddha_-800x600-2-800x600.jpg',
     '/wp-content/uploads/cutlery-tray-800x600-2-800x600.jpeg',
     '/wp-content/uploads/custommade-wallet-800x600-2-800x600.jpeg',
     '/wp-content/uploads/UI-paths-800x800-1.jpg'
];
            
foreach($a as $img) 
    echo preg_replace('#-\d+x\d+((-\d+|)\.[a-z]{3,4})#i', '$1', $img).'<br>';

它检查结尾 -(number)x(number)(dot)(extension)

这是 « 匹配拒绝,恢复匹配 » 的明显案例。 所以,你只需要考虑你要搜索删除的模式:

[0-9]+x[0-9]+

这很简单(非常浓缩):

\d+x\d+

下一步是构建组提取器:

^(.*[^0-9])[0-9]+x[0-9]+([^x]*\.[a-z]+)$

我们添加了文件的扩展名作为提取的后缀。 拒绝“x”字符是确保仅匹配最后一个大小的(坏...)技巧。 它不适用于大小和扩展名之间的字母数字后缀(例如toto-800x1024-ex.jpg )。

然后,替换字符串:

$1$2

当然,为了清楚起见,我们只处理成功提取的文件名。 但是如果你想处理整个字符串,模式就变成了:

^/(.*[^0-9])[0-9]+x[0-9]+([^/x]*\.[a-z]+)$

如果要拆分文件名和文件夹名:

^/(.*/)([^/]+[^0-9])[0-9]+x[0-9]+([^/x]*)(\.[a-z]+)$
^/(.*/)([^/]+\D)\d+x\d+([^/x]*)(\.[a-z]+)$
$folder=$1;
$filename="$1$2";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM