REGEX: захват имени файла с URL без расширения файла - PullRequest
9 голосов
/ 09 сентября 2010

Я пытаюсь создать регулярное выражение Javascript, которое захватывает имя файла без расширения файла. Я прочитал другие посты здесь и 'перейти на эту страницу: http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html', кажется, ответ по умолчанию. Это, кажется, не делает работу для меня. Вот как я пытаюсь заставить регулярное выражение работать:

  1. Найти последнюю косую черту '/' в строке темы.
  2. Захватите все между этим слешем и следующим периодом.

Самое близкое, что я мог получить: / ([^ /] ). \ W $ Который в строке 'http://example.com/index.htm' exec () будет захватывать / index.htm и index .

Мне нужно это только для захвата index .

Ответы [ 5 ]

40 голосов
/ 09 сентября 2010
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("."));
17 голосов
/ 09 сентября 2010

проверено и работает, даже для страниц без расширения файла.

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

var url = "/3576176/regex-zahvat-imeni-faila-s-url-bez-rasshireniya-faila";
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 оу, игнорируй регистр.

1 голос
/ 10 мая 2019

Попробуйте это регулярное выражение. Он может даже обрабатывать имена файлов с несколькими периодами.

(?<=\/)[^\/]*(?=\.\w+$)
1 голос
/ 01 декабря 2016

Я не нашел ни одного из ответов, которые были бы достаточно надежными.Вот мое решение.

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 = "/3576176/regex-zahvat-imeni-faila-s-url-bez-rasshireniya-faila";
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

Чтобы соответствовать исходному вопросу, стандартным поведением является исключение расширения, но это легко можно изменить.

1 голос
/ 09 сентября 2010

Вы можете попробовать это регулярное выражение:

([^/]*)\.[^.]*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...