JavaScript의 문자열에서 파일 확장자를 자르는 방법은 무엇입니까?


295

예를 들어, 파일 이름이 될 수있는 위치 x = filename.jpg를 가정하고 싶습니다 (파일 이름에는 단순화하기 위해 [a-zA-Z0-9-_] 만 포함되어 있다고 가정하십시오).filenamefilename

I 톱 x.substring(0, x.indexOf('.jpg'))DZone 조각 , 아닌 것 x.substring(0, x.length-4)더 잘 수행? 왜냐하면 length속성이며 문자 검사를 수행하지 않는 반면 indexOf()함수이며 문자 검사를 수행하기 때문입니다.



stackoverflow.com/questions/1991608/… 과 거의 동일합니다 . 그리고이 중 많은 작업을 수행하지 않으면 효율성에 대한 걱정은 조기 최적화입니다.
Archetypal 폴

ES6의 시대에, 또한 참조 경로 는 nodejs 또는 적절한 transpilation 사용하는 경우 - 모듈
프랭크 Nocke

답변:


173

확장의 길이를 알고 있으면 사용할 수 있습니다 x.slice(0, -4)(여기서 4는 확장 및 점의 세 문자 임).

길이를 모르면 @John Hartsock 정규식이 올바른 접근 방법입니다.

정규 표현식을 사용하지 않으려면 다음을 시도해보십시오 (성능이 낮음).

filename.split('.').slice(0, -1).join('.')

확장자가없는 파일에서는 실패합니다.


이 솔루션이 가장 좋습니다. 깨끗하고 파일 확장자가 항상라는 것을 알기 때문에 사용할 수 있습니다 .jpg. 루비처럼 뭔가를 찾고 있었다 x[0..-5], 그리고 x.slice(0, -4)멋지다! 감사! 제공된 다른 모든 강력한 대안에 대해 다른 모든 사람에게 감사합니다!
ma11hew28

22
이것은 최적의 솔루션이 아닙니다. 아래의 다른 솔루션을 확인하십시오.
bunjeeb

8
그리고 확장의 길이를 100 % 확신하지 못한다면, 이것을하지 마십시오 : "picture.jpeg".slice(0, -4)-> "picture".
basic6

13
이것은 위험한 해결책이므로 실제로 형식의 길이를 모릅니다.
Coder

"확장의 길이를 아는 경우"이것이 허용 가능한 가정 이었으므로 수십 년이 지났습니다. 더 이상 이것을 사용하지 마십시오.
Alexander-복원 모니카

453

확실하지 빠르게 수행 할 것입니다하지만이 같은 확장에 관해서이 더 안정적 일 것입니다 무슨 .jpeg또는.html

x.replace(/\.[^/.]+$/, "")

15
/를 경로 구분 기호로 허용하지 않기를 원할 수도 있으므로 정규 표현식은 /\.[^/.]+$/입니다.
gsnedders

파일 확장명 (.txt 또는 .html 또는 .htaccess)에 관계없이 파일 이름에 추가 마침표 (.) 문자를 포함 할 수 있습니다. 확장자 자체에 마침표가 포함되어 있으므로 .tar.gz를 처리하지 않습니다. 파일 이름이 파일 확장자보다 추가 기간을 포함하는 것이 일반적입니다. 감사!
Steve Seeger

2
@Vik '올바른 답'과 허용 된 답 사이에는 차이가 있습니다. 허용되는 답변은 질문을 한 사람에게 도움이되는 답변입니다.
Steven

4
백 슬래시가있을 수 있기 때문에 Windows 플랫폼에 문제가 있다고 가정합니다. 따라서 정규 표현식은 /\.[^/\\.]+$/이어야합니다.
Alex Chuev

1
@ElgsQianChen 여기에 귀하의 질문에 답변 할 수있는 훌륭한 도구가 있습니다 regexr.com
John

281

에서 Node.js를 다음과 같이 확장자가없는 파일의 이름을 얻을 수있다.

const path = require('path');
const filename = 'hello.html';

path.parse(filename).name; // hello
path.parse(filename).ext;  // .html

Node.js 문서 페이지 에서 추가 설명 .


2
당신이 @kaasdude ....에 대해 이야기하고있는 것은 ...이 방법은 노드의 확장을 효과적으로 제거합니다. 표현하려는 것을 확실하지 않지만이 방법은 진주를 사용합니다.
Erick

1
이 답변은 서버 측 노드로 제한됩니다. 반응 코드에서 이것을 사용하려고하면 가져 오는 것 같지 않습니다.
Charlie

1
디렉토리를 포함한 경로에서 확장자를 제거하려면 var parsed = path.parse(filename)다음을 수행하십시오 path.join(parsed.dir, parsed.name).
Jespertheend

또 다른 가능성은 let base = path.basename( file_path, path.extname( file_path ) )입니다.
bicarlsen

116

x.length-43 자의 확장명 만 설명합니다. 당신은 어떤이있는 경우 filename.jpeg또는 filename.pl?

편집하다:

당신은 항상의 확장이있는 경우에 답변을 ... 물론 .jpg, x.length-4잘 작동합니다.

그러나 확장의 길이를 모르는 경우 여러 가지 솔루션이 더 우수하고 강력합니다.

x = x.replace(/\..+$/, '');

또는

x = x.substring(0, x.lastIndexOf('.'));

또는

x = x.replace(/(.*)\.(.*?)$/, "$1");

OR (파일 이름에 하나의 점만 있음)

parts = x.match(/[^\.]+/);
x = parts[0];

OR (점 하나만 있음)

parts = x.split(".");
x = parts[0];

12
?? 이 경우 파일 이름 ex : "summer.family.jpg"를 가질 수 있습니다.이 경우 split ( '.') [0] 은 부분 파일 이름 만 반환합니다. 답변에서 해당 내용을 제거하거나 해당 예의 문제 아래에 명확하게 설명합니다. @basarat ...
Roko C. Buljan

부품 분할과 관련하여 자주하는 var parts = full_file.split("."); var ext = parts[parts.length-1]; var file = parts.splice(0,parts.length-1).join(".");
radicand

x.split ( ".")는 답으로 간주되어서는 안됩니다. '.'을 사용한다는 것을 알고 있습니다. 거의 모든 파일 명명 규칙 (예 : 'survey.controller.js'또는 'my.family.jpg')
Lee Brindley

@ Lee2808 : 따라서 단 하나의 점 경고. 이것은 단순히 응용 프로그램에 따라 여러 가지 접근 방식이 있음을 보여주기위한 것입니다. 거의 모든 경우에 다른 방법 중 하나를 사용합니다.
Jeff B

x = x.substr(0, x.lastIndexOf('.'));-당신은 아마 의미 x = x.substring(0, x.lastIndexOf('.'));?
Dziad Borowy

39

마지막 점이 확장 구분 기호라는 가정을 사용할 수 있습니다.

var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));

파일 확장자가 없으면 빈 문자열을 반환합니다. 이 기능을 사용하여 수정하려면

function removeExtension(filename){
    var lastDotPosition = filename.lastIndexOf(".");
    if (lastDotPosition === -1) return filename;
    else return filename.substr(0, lastDotPosition);
}

파일 이름 확장자가 없으면 경고가 실패합니다. 빈 문자열이 남았습니다.
Brad

18
점이없는 짧은 버전입니다. var f = x.substr(0, x.lastIndexOf('.')) || x;빈 문자열이 거짓이기 때문에 작동하므로 x를 반환합니다.
Jonathan Rowny

22

나는 읽기가 너무 어렵지 않은 하나의 라이너이기 때문에 이것을 좋아합니다.

filename.substring(0, filename.lastIndexOf('.')) || filename


12

구분 기호가 문자열에없는 경우에도 작동합니다.

String.prototype.beforeLastIndex = function (delimiter) {
    return this.split(delimiter).slice(0,-1).join(delimiter) || this + ""
}

"image".beforeLastIndex(".") // "image"
"image.jpeg".beforeLastIndex(".") // "image"
"image.second.jpeg".beforeLastIndex(".") // "image.second"
"image.second.third.jpeg".beforeLastIndex(".") // "image.second.third"

다음과 같이 단일 라이너로 사용할 수도 있습니다.

var filename = "this.is.a.filename.txt";
console.log(filename.split(".").slice(0,-1).join(".") || filename + "");

편집 : 이것은보다 효율적인 솔루션입니다.

String.prototype.beforeLastIndex = function (delimiter) {
    return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}

10

유효한 옵션인지 모르겠지만 이것을 사용합니다.

name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join('.'); // we split by '.' and we join by '.' to restore other eventual points.

그것은 내가 아는 하나의 작업 일뿐 만 아니라 적어도 항상 작동해야합니다!

업데이트 : 원 라이너를 원한다면 다음과 같습니다.

(name.split('.').slice(0, -1)).join('.')


1
name.join ( '')이 아니라 name.join ( '.')이어야합니다. 점으로 나누지 만 쉼표로 조인하므로 hello.name.txt반환hello, name
Evil


7

다른 정규식 기반 솔루션은 다음과 같습니다.

filename.replace(/\.[^.$]+$/, '');

마지막 세그먼트 만 잘라야합니다.


7

간단한 것 :

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;

6

허용 된 답변은 마지막 확장 부분 만 제거하고 ( .jpeg) 대부분의 경우 좋은 선택입니다.

한 번 모든 확장명 ( .tar.gz) 을 제거해야 하고 파일 이름에 점이 포함되지 않도록 제한되었으므로 2015-01-01.backup.tar문제가되지 않습니다.

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");


3

전체 경로 (예 :)가 포함 된 변수를 처리 thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"해야하고 "filename"만 반환하려는 경우 다음을 사용할 수 있습니다.

theName = thePath.split("/").slice(-1).join().split(".").shift();

결과는 theName == "filename"입니다 .

Chrome 디버거의 콘솔 창에 다음 명령을 작성하십시오. window.location.pathname.split("/").slice(-1).join().split(".").shift()

파일 이름과 확장자 (예 :) 만 처리해야하는 경우 theNameWithExt = "filename.jpg":

theName = theNameWithExt.split(".").shift();

결과는 위와 동일한 Name == "filename"입니다 .

노트:

  1. 첫 번째는 조금 느리기 때문에 더 많은 작업을 수행합니다. 그러나 두 경우 모두에서 작동합니다. 즉, 경로가 포함 된 주어진 문자열 또는 ex가있는 파일 이름에서 확장자없이 파일 이름을 추출 할 수 있습니다. 두 번째는 주어진 변수가 filename.ext와 같은 ext를 가진 파일 이름을 포함하지만 조금 더 빠른 경우에만 작동합니다.
  2. 두 솔루션 모두 로컬 및 서버 파일 모두에서 작동합니다.

그러나 다른 답변과 성능 비교 또는 브라우저 또는 OS 호환성에 대해서는 아무것도 말할 수 없습니다.

작업 스 니펫 1 : 전체 경로

var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

작업 스 니펫 2 : 확장자가있는 파일 이름

var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

작업 스 니펫 2 : 이중 확장자를 가진 파일 이름

var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
  


3

꽤 늦었지만 일반 오래된 JS-

path.replace(path.substr(path.lastIndexOf('.')), '')


또는 path.split('.').pop()한 부분 파일 확장자
mixdev

그는 실제로 확장자가 아닌 파일 이름을 얻으려고했습니다!
Munim Dibosh

3

Node.js는 전체 경로 유지 디렉토리에서 확장명을 제거합니다

https://stackoverflow.com/a/31615711/895245 예를 들어 did- path/hello.html> hello이지만 원하는 경우 path/hello.html-> path/hello을 사용할 수 있습니다.

#!/usr/bin/env node
const path = require('path');
const filename = 'path/hello.html';
const filename_parsed = path.parse(filename);
console.log(path.join(filename_parsed.dir, filename_parsed.name));

디렉토리도 출력합니다.

path/hello

https://stackoverflow.com/a/36099196/895245 도 이것을 달성하지만,이 접근법은 의미 적으로 약간 더 만족 스럽습니다.

Node.js v10.15.2에서 테스트되었습니다.


0

이것은 정규식이 유용한 곳입니다! Javascript의 .replace()메소드는 정규 표현식을 사용하며 원하는 것을 달성하기 위해이를 사용할 수 있습니다.

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");

0

또 하나의 라이너 – 우리는 파일이 jpg 그림이라고 가정합니다. >> 예 : var yourStr = 'test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'

0

path기동 하는 데 사용할 수 있습니다 .

var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;

산출

> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'


0

이것은 regex 또는 indexOf를 사용하지 않고 파일 이름에서 확장명을 제거하는 데 사용하는 코드입니다 (indexOf는 IE8에서 지원되지 않습니다). 확장자는 마지막 '.'뒤의 텍스트라고 가정합니다. 캐릭터.

그것은 작동합니다 :

  • 확장자가없는 파일 : "myletter"
  • '.'파일 이름에서 : "my.letter.txt"
  • 알 수없는 파일 확장자의 길이 : "my.letter.html"

코드는 다음과 같습니다.

var filename = "my.letter.txt" // some filename

var substrings = filename.split('.'); // split the string at '.'
if (substrings.length == 1)
{
  return filename; // there was no file extension, file was something like 'myfile'
}
else
{
  var ext = substrings.pop(); // remove the last element
  var name = substrings.join(""); // rejoin the remaining elements without separator
  name = ([name, ext]).join("."); // readd the extension
  return name;
}

로 실패하면 hello.tar.gz출력은 hellotar입니다.
Asif Ali

#AsifAli 감사합니다. 파일 확장자를 읽는 것을 잊었습니다. 답변을 업데이트했습니다. 지금 작동하기를 바랍니다.
작은 뇌

-3

x.substring (0, x.lastIndexOf ( '.'))와 같은 것을 사용합니다. 성능을 원한다면 자바 스크립트를 사용하지 마십시오. -p 아니오, 하나 이상의 진술은 실제로 모든 목적의 99.99999 %에 중요하지 않습니다.


2
"성능을 추구한다면 전혀 자바 스크립트를 사용하지 마십시오." -웹 응용 프로그램에서 사용할 것을 제안하는 것은 무엇입니까?
TJ

그는 웹 애플리케이션에 대해서는 언급하지 않았다.
Lucas Moeskops

1
이 질문은 7 년 전에 2010 년에 게시되었으며 답변은 웹 응용 프로그램에서만 사용되었습니다. (노드는 막 태어 났으며, 당시에는 가이드 나 NPM조차 없었습니다)
TJ

;-) 여전히 이와 같은 작업에서 성능이 중요한 경우 백엔드에서이 작업을 수행하고 프런트 엔드에서 결과를 처리 할 수 ​​있습니다.
Lucas Moeskops
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.