2010-03-12 33 views
19

Làm cách nào để chèn "_thumb" vào các tệp đang được tạo màu lục lam.RegEx - Cách chèn chuỗi trước phần mở rộng tệp

Ví dụ: tôi có trang web cho phép người dùng tải lên hình ảnh. Kịch bản lấy hình ảnh, tối ưu hóa nó và lưu vào tập tin. Làm thế nào tôi sẽ làm cho nó chèn chuỗi "_thumb" cho hình ảnh tối ưu?

Tôi hiện đang lưu 1 phiên bản của tệp được xác định trước. ch-1268312613-photo.jpg

Tôi muốn lưu bản gốc như chuỗi trên, nhưng muốn thêm, "_thumb" như chuỗi sau ch-1268312613-photo_thumb.jpg

Trả lời

34

Không cần phải sử dụng regex. Điều này sẽ làm điều đó:

$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); 
+5

không cho những thứ như '.tar.gz' – Skyzer

3

Tại sao bạn muốn sử dụng RegEx? Tiện ích mở rộng luôn là .jpg và chỉ có một tiện ích mở rộng? Có lẽ bạn có thể thay thế nó bằng _thumb.jpg?

Nếu không đơn giản như vậy, bạn có thể sử dụng hàm như pathinfo để trích xuất tên tệp + tiện ích và thực hiện thay thế ở đó. Đó là làm việc mà không có một regex, quá, mà có thể là quá mức cần thiết ở đây:

$info = pathinfo($file); 
$no_extension = basename($file, '.'.$info['extension']); 
echo $no_extension.'_thumb.'.$info['extension'] 
1
$str = "ch-1268312613-photo.jpg"; 
print preg_replace("/\.jpg$/i","_thumb.jpg",$str); 
1
preg_replace("/(\w+)\.(\w+)/","'\\1_thumb.\\2'","test.jpg"); 

Tôi nghĩ rằng việc sử dụng một regexp là tốc độ hơn rất nhiều hiệu quả và thực sự tốt hơn cho linh hoạt.

Nhưng tôi thừa nhận giải pháp Chad là thanh lịch và hiệu quả

+0

Có một vài điều sai trái với điều này. Bạn đã không thoát khỏi giai đoạn trong mô hình, vì vậy mà sẽ phù hợp với bất kỳ nhân vật nào cả. Ngoài ra, '\ w' không bao gồm tất cả các ký tự tên tệp có thể. –

+0

Đúng, bởi vì tôi không đánh dấu nó là mã để \. được giải thích như thế nào. Và True một lần nữa nhưng hệ thống tập tin có quyền sử dụng bất kỳ char, tôi đặt cược không – Darkyo

2

Giả sử bạn chỉ có sự xuất hiện của ".jpg" một lần trong chuỗi, bạn có thể làm một str_replace thay vì regex

$filename = str_replace(".jpg", "_thumb.jpg", $filename); 

hoặc thậm chí tốt hơn, substr_replace để chỉ cần chèn chuỗi đâu đó ở giữa:

$filename = substr_replace($filename, '_thumb', -4, 0); 
9

Thay vì đi theo con đường biểu thức chính quy (hoặc crud khác thao tác chuỗi ký tự) có lẽ một số hàm liên quan đến tên tệp có thể dễ dàng hơn để sống với: cụ thể là pathinfo (để lấy đuôi tệp) và tên cơ sở (để lấy tên tệp trừ đi phần mở rộng).

$ext = pathinfo($filename, PATHINFO_EXTENSION); 
$thumb = basename($filename, ".$ext") . '_thumb.' . $ext; 

Sửa: @tanascius xin lỗi vì câu trả lời rất giống nhau, đoán tôi nên đã kiểm tra ít pop-up trong khi viết những dòng này (nó mất một thời gian, tôi đã bị phân tâm).

Các vấn đề liên quan