簡體   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