我正在為 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
非常感激!
uj5u.com熱心網友回復:
您可以使用帶有反向參考的捕獲組來匹配有 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;
}
輸出
/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
uj5u.com熱心網友回復:
我會嘗試這樣的事情。你可以自己測驗一下。這是代碼:
$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)
uj5u.com熱心網友回復:
這是?匹配拒絕,恢復匹配?的明顯案例。因此,您只需要考慮要洗掉的模式:
[0-9] x[0-9]
下一步是構建組提取器:
^(.*[^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] )$
$folder=$1;
$filename="$1$2";
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/432553.html
