Найти базовое имя в URL-адресе в Javascript

Я хочу извлечь базовое имя из URL-адреса изображения в Javascript. Кто-нибудь захочет дать мне руку на Regex?

Правило:

  • вернуть все справа от последнего / слева от последнего .

    www.domain.com/images/ image.hires.jpg

  • Если нет ., верните полное базовое имя www.domain.com/images/ image_hi_res

У меня неуклюжий /\/[^.]+\.[^.]+$/, но не знаю, как сделать опции / и . опционными и как искать только последний ..

Приветствую всех людей за большой вклад, как всегда. Я выбрал одно Regex, которое работало для меня из коробки.

Ответ 1

Еще одно решение:

url.replace(/^.*\/|\.[^.]*$/g, '')

Ответ 2

В этом случае я бы не использовал регулярное выражение, а просто lastIndexOf и substring. Что-то вроде

function findBaseName(url) {
    var fileName = url.substring(url.lastIndexOf('/') + 1);
    var dot = fileName.lastIndexOf('.');
    return dot == -1 ? fileName : fileName.substring(0, dot);
}

Ответ 3

Попробуйте это регулярное выражение:

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

Ответ 4

В ваших примерах, предполагая, что входная строка является полным URL-адресом и не более того, у меня был успех с

/\/[^\/]+(?=\.[^.]+$)|\/[^\/]+$/

Это сначала пытается совместить все с последнего / до последнего .; если нет точки, она будет пытаться совместить все с последнего / до конца строки.

Ведущий / содержится в совпадении (JavaScript не поддерживает lookbehind, иначе я мог бы использовать это), поэтому вам нужно отрубить первый символ совпадения.

Ответ 5

Когда у вас есть доступ к DOM, вы можете использовать собственные HTMLHyperlinkElementUtils свойства тега <a>:

function urlInfo (url) {

  var props = 'hash host hostname href origin password pathname port protocol username search';

  if (!window.urlInfoAnchorElement)
    window.urlInfoAnchorElement = document.createElement('a');

  urlInfoAnchorElement.href = url;

  return props.split(' ').reduce(function (m, v, i) {
    m[v] = urlInfoAnchorElement[v]; return m;
  }, {});

}

// Example:
urlInfo('http://localhost:4000/guidelines/7yQxvndK?get=sup&love=1#oiwjef');

/* => {
  hash: "#oiwjef"
  host: "localhost:4000"
  hostname: "localhost"
  href: "http://localhost:4000/guidelines/7yQxvndK?get=sup&love=1#oiwjef"
  origin: "http://localhost:4000"
  password: ""
  pathname: "/guidelines/7yQxvndK"
  port: "4000"
  protocol: "http:"
  search: "?get=sup&love=1"
} */

Ответ 6

Я рекомендую использовать activex FileSystemObject. Конечно, вам нужно отметить это как безопасное в реестре, чтобы выполнить его без экранов nag, но это очень полезно. Функция вашего звонка... GetBaseName делает то, что вы хотите.