2010-09-08 15 views
8

Próbuję utworzyć regeks Javascript, który przechwytuje nazwę pliku bez rozszerzenia pliku. Przeczytałem inne posty tutaj i "goto this page:http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html" wydaje się być domyślną odpowiedzią. Wydaje mi się, że to nie działa. Oto jak próbuję uruchomić regex:REGEX: Przechwyć nazwę pliku z adresu URL bez rozszerzenia pliku

  1. Znajdź ostatni ukośnik "/" w temacie tematu.
  2. Uchwyć wszystko między tym ukośnikiem a następnym okresem.

Najbliżej mogę dostać było. /([^ /] ) \ w $ które w ciągu 'http://example.com/index.htm' exec() by uchwycić /index.htm i indeks.

Potrzebuję tego, aby przechwycić jedynie indeks.

Odpowiedz

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

chodźmy przez wyrażenia regularnego:

[^\/]+ # 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 

To wyrażenie będzie zebrać wszystkie znaki, które nie są łamane, które są natychmiast po (dzięki lookahead) przez rozszerzenie i koniec łańcucha - lub, innymi słowy, wszystko po ostatnim ukośniku i do rozszerzenia.

Alternatywnie, można to zrobić bez wyrażeń regularnych w ogóle, poprzez znalezienie położenia ostatniej / a ostatnim . użyciu lastIndexOf i coraz substring między tymi punktami:

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

To rozwiązanie kończy się niepowodzeniem w nazwach plików z wieloma kropkami, jeśli potrzebujesz tego testu, patrz rozwiązanie @ BGerrissen. –

1

Można spróbować tej regex:

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

przetestowany i działa, nawet dla strony bez rozszerzenia pliku.

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_-]*) się ciągiem zawierającym litery, cyfry, podkreślenia lub myślników.
\.? Być może po ciągu występuje kropka.
[^\\\/]*$ ale z pewnością nie następuje ukośnik lub ukośnik odwrotny do końca.
/i o tak, zignoruj ​​sprawę.

+0

Spowoduje to również przechwycenie nazw plików, które mają wiele okresów, na które przyjęta odpowiedź kończy się niepowodzeniem. (foo.global.js, itp.). –

0

Nie znalazłem żadnej z odpowiedzi, która byłaby wystarczająco silna. Oto moje rozwiązanie.

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 

W celu dopasowania do pierwotnego pytania domyślnym zachowaniem jest wykluczenie rozszerzenia, ale można je łatwo odwrócić.

Powiązane problemy