2010-09-08 42 views
8

Tôi đang cố gắng tạo một Javascript Regex nắm bắt tên tệp mà không có phần mở rộng tệp. Tôi đã đọc các bài đăng khác tại đây và 'goto trang này:http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html' có vẻ là câu trả lời mặc định. Điều này dường như không làm công việc cho tôi. Vì vậy, đây là cách tôi đang cố gắng để có được regex để làm việc:REGEX: Chụp tên tệp từ URL mà không cần phần mở rộng tệp

  1. Tìm dấu gạch chéo chuyển tiếp cuối cùng '/' trong chuỗi chủ đề.
  2. Ghi lại mọi thứ giữa dấu gạch chéo đó và khoảng thời gian tiếp theo.

Gần nhất tôi có thể nhận được là:. /([^ /] ) \ w $ nào trên chuỗi 'http://example.com/index.htm' exec() sẽ chụp /index.htmchỉ số.

Tôi cần điều này để chỉ chụp chỉ số.

Trả lời

39
var url = "http://example.com/index.htm"; 
var filename = url.match(/([^\/]+)(?=\.\w+$)/)[0]; 

Hãy đi qua các biểu thức chính quy:

[^\/]+ # one or more character that isn't a slash 
(?=  # open a positive lookahead assertion 
    \.  # a literal dot character 
    \w+  # one or more word characters 
    $  # end of string boundary 
)   # end of the lookahead 

biểu hiện này sẽ thu thập tất cả các nhân vật mà không phải là một dấu gạch chéo đó được tuân thủ ngay lập tức (nhờ vào số lookahead) bởi một phần mở rộng và phần cuối của chuỗi - hay nói cách khác, mọi thứ sau dấu gạch chéo cuối cùng và cho đến khi phần mở rộng.

Cách khác, bạn có thể làm điều này mà không biểu thức thông thường hoàn toàn, bằng cách tìm vị trí của người cuối cùng / và cuối cùng . sử dụng lastIndexOf và nhận được một substring giữa những điểm:

var url = "http://example.com/index.htm"; 
var filename = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf(".")); 
+1

Giải pháp này không thành công trên tên tệp có nhiều giai đoạn, nếu bạn cần thử nghiệm đó xem giải pháp @ BGerrissen. –

1

Bạn có thể thử regex này:

([^/]*)\.[^.]*$ 
17

thử nghiệm và các công trình, ngay cả đối với các trang không có phần mở rộng tệp.

var re = /([\w\d_-]*)\.?[^\\\/]*$/i; 

var url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention"; 
alert(url.match(re)[1]); // 'regex-capture-filename-from-url-without-file-extention' 

url = 'http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html'; 
alert(url.match(re)[1]); // 'uri-url-parsing' 

([\w\d_-]*) nhận chuỗi chứa chữ cái, chữ số, dấu gạch dưới hoặc dấu gạch nối.
\.? có lẽ chuỗi được theo sau bởi một khoảng thời gian.
[^\\\/]*$ nhưng chắc chắn không theo sau dấu gạch chéo hoặc dấu gạch chéo ngược cho đến cuối cùng.
/i oh yeh, bỏ qua trường hợp.

+0

Điều này cũng chụp tên tệp có nhiều dấu chấm, câu trả lời được chấp nhận không thành công. (foo.global.js, v.v.). –

0

Tôi không tìm thấy bất kỳ câu trả lời nào ở gần đủ mạnh. Đây là giải pháp của tôi.

function getFileName(url, includeExtension) { 
    var matches = url && typeof url.match === "function" && url.match(/\/?([^/.]*)\.?([^/]*)$/); 
    if (!matches) 
     return null; 

    if (includeExtension && matches.length > 2 && matches[2]) { 
     return matches.slice(1).join("."); 
    } 
    return matches[1]; 
} 

var url = "http://example.com/index.htm"; 
var filename = getFileName(url); 
// index 
filename = getFileName(url, true); 
// index.htm 

url = "index.htm"; 
filename = getFileName(url); 
// index 
filename = getFileName(url, true); 
// index.htm 

// BGerrissen's examples 
url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention"; 
filename = getFileName(url); 
// regex-capture-filename-from-url-without-file-extention 
filename = getFileName(url, true); 
// regex-capture-filename-from-url-without-file-extention 

url = "http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html"; 
filename = getFileName(url); 
// uri-url-parsing 
filename = getFileName(url, true); 
// uri-url-parsing.html 

// BGerrissen fails 
url = "http://gunblad3.blogspot.com/2008/05/uri%20url-parsing.html"; 
filename = getFileName(url); 
// uri%20url-parsing 
filename = getFileName(url, true); 
// uri%20url-parsing.html 

// George Pantazis multiple dots 
url = "http://gunblad3.blogspot.com/2008/05/foo.global.js"; 
filename = getFileName(url); 
// foo 
filename = getFileName(url, true); 
// foo.global.js 

// Fringe cases 
url = {}; 
filename = getFileName(url); 
// null 
url = null; 
filename = getFileName(url); 
// null 

Để phù hợp với câu hỏi ban đầu, hành vi mặc định là loại trừ tiện ích, nhưng có thể dễ dàng bị đảo ngược.

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