2010-07-19 66 views
11

tôi cần lấy tên tệp từ chuỗi đường dẫn tệp. Ví dụ, từ chuỗi này \abc\def\filename.txt tôi cần để có được filename.txttrích xuất tên tệp từ đường dẫn

cố gắng để làm điều này với regexp:

$filepath="abc\filename.txt"; 
$filename = preg_replace("/.+\\/","",$filepath); 

nhưng nó mang lại cho tôi một lỗi. Tôi nên sử dụng regex nào để giải quyết vấn đề này?

+0

Không có lý do gì để thay thế ký tự không có gì sử dụng preg_replace. Thay vào đó, hãy sử dụng preg_match trực tiếp hơn. (Xem câu trả lời của tôi cho cách). –

Trả lời

33

bạn nên sử dụng chức năng basename thay vì:

$filepath = 'abc\filename.txt'; 
$filename = basename($filepath); 

chỉnh sửa: lưu ý quan trọng, bạn cần phải sử dụng dấu nháy đơn khi bạn có dấu gạch chéo ngược trong chuỗi của bạn, choàng chúng đúng cách.

lưu ý: này sẽ không công việc:

$filepath = "abc\filename.txt"; 
$filename = basename($filepath); 

bởi vì bạn đang biến $ filepath Infact giữ:

abc[special char here equalling \f]ilename.txt

chỉnh sửa khác: regex này hoạt động quá ..

$filepath = '\def\abc\filename.txt'; 
$basename = preg_replace('/^.+\\\\/', '', $filepath); 

tất cả những gì đã sai với bản gốc của bạn là bạn đã có dấu ngoặc kép chứ không phải là duy nhất và dấu gạch chéo ngược cần hai lần thoát (\\ thay vì \).

+0

@nathan: Điều đó sẽ không hoạt động, nó sẽ cung cấp cho bạn 'abcilename.txt' – Sarfraz

+0

@sAc: Nó hoạt động hoàn hảo cho tôi. – casablanca

+0

@casablanca: Hãy hy vọng nếu những người khác cũng thử mã đó :) Có vẻ như không hoạt động cho tôi. – Sarfraz

3

này nên làm điều đó:

$filepath='abc\filename.txt'; 
$basename = preg_replace('/^.+[\\\\\\/]/', '', $filepath); 
echo $basename; 

Kết quả:

filename.txt 
+0

sẽ không hoạt động đối với filepath '\ abc \ def \ filename.txt' nó sẽ trả về '' def \ filename.txt' – nathan

+0

@nathan: Tôi tin rằng vấn đề nằm trong '\\', nó hoạt động tốt với/'trong đường dẫn. – Sarfraz

3

Hai giải pháp:

  1. preg_match()
  2. str_replace() với pathinfo()

1: preg_match()

Ok, do đó, vấn đề là bạn đang sử dụng dấu gạch chéo ngược. Bạn phải đảm bảo rằng bạn không sử dụng dấu ngoặc kép để xác định tệp của bạn, vì dấu gạch chéo ngược được hiểu là chuỗi thoát. Sử dụng dấu nháy đơn.

Bên cạnh đó, với một regex, nó nhiều đơn giản để có được một tên tập tin bằng cách di chuyển từ phía sau của con đường cho đến khi bạn nhấn một dấu chéo ngược .... lừa là một dấu gạch chéo là \\\\ .. here's why

Cuối cùng , bạn không muốn sử dụng preg_replace.Chỉ cần tìm ra tên tập tin với preg_match:

<?php 
    // Use single quotes or the backslash will be interpreted as an esacpe sequence 
$filepath = '\abc\def\filename.txt'; 

    // You have to use 4 backslashes to represent your single backslash 
    // The regex picks the characters that are NOT \ from the end of the path 
$pattern = '/[^\\\\]+$/'; 

    // Use $matches to store the match 
preg_match($pattern, $filepath, $matches); 

    // Display answer now, or use later 
echo $matches[0]; 
?> 

2: str_replace() với pathinfo()

Như những người khác nói, basename() là một lựa chọn tốt. Một tùy chọn khác, nếu có bất kỳ cơ hội nào mà bạn cũng có thể cần thư mục hoặc thông tin đường dẫn khác sau đó xuống dòng là sử dụng pathinfo()

Vấn đề là cả tên cơ sở và pathinfo giả định dấu gạch chéo, vì vậy bạn phải chuyển đổi dấu gạch chéo ngược chém:

Ví dụ:

<?php 
    // Make sure to use single quotes 
$filepath='abc\filename.txt'; 
    // Replace backslash with forward slash 
$filepath = str_replace('\\', '/', $filepath); 
$path_parts = pathinfo($filepath); 

    // This is the answer you want 
echo $path_parts['basename'], "\n"; 

    // But you also have access to these 
echo $path_parts['dirname'], "\n"; 
echo $path_parts['extension'], "\n"; 
echo $path_parts['filename'], "\n"; // since PHP 5.2.0 
?> 
+0

Điều đó cũng không có tác dụng, anh ta cũng cần giải pháp regex như được anh ta chỉ ra. – Sarfraz

+0

@sAc Tôi nghĩ OP chỉ ra rằng regex không hoạt động tốt ... gtg nhưng sẽ thử trong một số ít –

+0

Nó chỉ hoạt động khi bạn sử dụng dấu gạch chéo (/) thay vì dấu gạch chéo ngược trong đường dẫn. +1 ngay bây giờ :) – Sarfraz

1
preg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt 
0

tại sao ném regex vào một vấn đề đơn giản như vậy?

$source = "/i/am/a/path.txt"; 
$pos = strrpos($source, '/'); 
$result = substr($source, $pos === FALSE ? 0 : $pos); 

EDIT: Tôi chưa thử - Tôi không có máy chủ PHP hoạt động. Có có thể là một lỗi off-by-one với chất nền và strrpos, nhưng nếu đó là trường hợp bạn chỉ cần thêm hoặc trừ một từ $pos.

EDIT2: Đây là một phiên bản xuyệc ngược:

$source = "\\i\\am\\a\\path.txt"; 
$pos = strrpos($source, '\\'); 
$result = substr($source, $pos === FALSE ? 0 : $pos); 
+1

OP có dấu gạch chéo ngược, vì vậy bạn không thể tăng gấp đôi trích dẫn $ nguồn và bạn phải thoát khỏi dấu gạch chéo ngược trong $ pos –

+0

@Peter: Đã thêm một phiên bản dấu gạch chéo ngược. –

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