REGEX:从URL捕获文件名,没有文件扩展名

时间:2010-09-08 20:13:51

标签: javascript regex url

我正在尝试创建一个Javascript Regex,它捕获没有文件扩展名的文件名。我在这里阅读了其他帖子并'转到此页面: http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html'似乎是默认答案。这似乎不适合我。所以这就是我试图让正则表达式工作的方式:

  1. 在主题字符串中找到最后一个正斜杠“/”。
  2. 在斜杠和下一个时段之间捕捉所有内容。
  3. 我能得到的最接近的是: /([^ /] )。\ w $ 字符串'http://example.com/index.htm'< / strong> exec()将捕获 /index.htm 索引

    我需要这个才能捕获 index

5 个答案:

答案 0 :(得分:40)

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

让我们看一下正则表达式:

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

此表达式将收集所有不是斜杠的字符(由于lookahead)通过扩展名和字符串的结尾 - 或者换句话说,在最后一个之后的所有内容斜线,直到延长。

或者,您可以在没有正则表达式的情况下执行此操作,方法是使用lastIndexOf找到最后/和最后.的位置,并在这些位置之间获得substring分:

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

答案 1 :(得分:17)

测试并运行,即使对于没有文件扩展名的页面也是如此。

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_-]*)获取包含字母,数字,下划线或连字符的字符串 \.?或许字符串后跟一段时间 [^\\\/]*$但是直到最后才会出现斜线或反斜杠 /i哦,是的,无视案例。

答案 2 :(得分:1)

你可以试试这个正则表达式:

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

答案 3 :(得分:1)

我没有发现任何答案足够强大。这是我的解决方案。

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

要符合原始问题,默认行为是排除扩展名,但可以轻松撤消。

答案 4 :(得分:0)

尝试此正则表达式。它甚至可以处理多个句点的文件名。

(?<=\/)[^\/]*(?=\.\w+$)