[英]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+
匹配維度格式例如
$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.