Làm cách nào để lấy tên tệp từ một đường dẫn đầy đủ bằng JavaScript?


310

Có cách nào để tôi có thể nhận giá trị cuối cùng (dựa trên biểu tượng '\') từ một đường dẫn đầy đủ không?

Thí dụ:

C:\Documents and Settings\img\recycled log.jpg

Với trường hợp này, tôi chỉ muốn lấy recycled log.jpgtừ đường dẫn đầy đủ trong JavaScript.

Câu trả lời:


697
var filename = fullPath.replace(/^.*[\\\/]/, '')

Điều này sẽ xử lý cả \ OR / trong đường dẫn


4
Không hoạt động trên MAC OSX, sử dụng chrome, nó thoát khỏi ký tự sau \
Pankaj Phartiyal

7
Theo trang web này, sử dụng replacenhiều chậm hơn so với substr, có thể được sử dụng kết hợp với lastIndexOf('/')+1: jsperf.com/replace-vs-substring
Nate

1
@nickf Nick, không chắc chắn tôi sẽ sai ở đâu nhưng mã không hoạt động với tôi khi đường dẫn tệp có dấu gạch chéo. Fiddle, mặc dù đối với `\` , nó hoạt động tốt.
Shubh

1
Tôi chỉ chạy cái này trên bảng điều khiển của mình và nó hoạt động hoàn hảo cho các dấu gạch chéo về phía trước: "/var/drop/foo/boo/moo.js".replace(/^.*[\\\/]/, '')trả vềmoo.js
vikkee

1
@ZloySmiertniy Có một vài người giải thích regex trực tuyến tốt. rick.measham.id.au/paste/explain.pl?regex=%2F%5E . *% 5B% 5C% 5C% 5C% 2F% 5D% 2F và regexper.com/#%2F%5E . *% 5B % 5C% 5C% 5C% 2F% 5D% 2F sẽ giúp. (Liên kết bị hỏng ở đây, nhưng sao chép-dán vào một tab và nó sẽ hoạt động)
nickf

115

Chỉ vì mục đích thực hiện, tôi đã thử nghiệm tất cả các câu trả lời được đưa ra ở đây:

var substringTest = function (str) {
    return str.substring(str.lastIndexOf('/')+1);
}

var replaceTest = function (str) {
    return str.replace(/^.*(\\|\/|\:)/, '');
}

var execTest = function (str) {
    return /([^\\]+)$/.exec(str)[1];
}

var splitTest = function (str) {
    return str.split('\\').pop().split('/').pop();
}

substringTest took   0.09508600000000023ms
replaceTest   took   0.049203000000000004ms
execTest      took   0.04859899999999939ms
splitTest     took   0.02505500000000005ms

Và người chiến thắng là câu trả lời theo phong cách Split và Pop , Cảm ơn bobince !


4
Theo thảo luận meta, vui lòng thêm trích dẫn thích hợp vào các câu trả lời khác. Nó cũng sẽ hữu ích để giải thích tốt hơn cách bạn phân tích thời gian chạy.
jpmc26

Hãy thoải mái để điểm chuẩn phiên bản này là tốt. Nên hỗ trợ cả đường dẫn tệp Mac và Windows. path.split(/.*[\/|\\]/)[1];
tfmontague

2
Bài kiểm tra không chính xác. sub chuỗiTest chỉ tìm kiếm cho dấu gạch chéo về phía trước, execTest - chỉ cho dấu gạch chéo ngược trong khi hai phần còn lại xử lý cả hai dấu gạch chéo. Và kết quả thực tế không liên quan (nữa). Hãy xem cái này: jsperf.com/name-from-path
Đau buồn

@Grief liên kết đó không còn hiệu lực.
paqogomez

88

Trong Node.js, bạn có thể sử dụng mô-đun phân tích của Path ...

var path = require('path');
var file = '/home/user/dir/file.txt';

var filename = path.parse(file).base;
//=> 'file.txt'

14
Nếu sử dụng Node.js, bạn chỉ có thể sử dụng basenamechức năng:path.basename(file)
electrovir

66

Con đường đến từ nền tảng nào? Đường dẫn Windows khác với đường dẫn POSIX khác với đường dẫn Mac OS 9 khác với đường dẫn RISC OS khác ...

Nếu đó là một ứng dụng web nơi tên tệp có thể đến từ các nền tảng khác nhau thì không có một giải pháp nào. Tuy nhiên, một cú đâm hợp lý là sử dụng cả '\' (Windows) và '/' (Linux / Unix / Mac và cũng là một thay thế trên Windows) làm dấu tách đường dẫn. Đây là phiên bản không phải RegExp để thêm phần thú vị:

var leafname= pathname.split('\\').pop().split('/').pop();

Bạn có thể muốn thêm rằng MacOS cổ điển (<= 9) đã sử dụng dấu tách dấu hai chấm (:), nhưng tôi không biết bất kỳ trình duyệt nào vẫn có thể được sử dụng mà không dịch đường dẫn MacOS sang đường dẫn POSIX ở dạng tệp : ///path/to/file.ext
mí mắt

4
Bạn chỉ có thể sử dụng pop () thay vì đảo ngược () [0]. Nó cũng sửa đổi mảng ban đầu nhưng trong trường hợp của bạn thì không sao.
Chetan Sastry

Tôi đang tự hỏi làm thế nào chúng ta có thể tạo một đối tác để có được đường dẫn.
Todd Horst

Một cái gì đó giống như var path = '\\Dir2\\Sub1\\SubSub1'; //path = '/Dir2/Sub1/SubSub1'; path = path.split('\\').length > 1 ? path.split('\\').slice(0, -1).join('\\') : path; path = path.split('/').length > 1 ? path.split('/').slice(0, -1).join('/') : path; console.log(path);
Todd Horst

Đặt tên " tên " có nguồn gốc từ Thư mục / Tên cấu trúc tệp "Cây", điều đầu tiên của câygốc , cuối cùng là các => tên tệp là điều cuối cùng trong đường dẫn cây => leaf :-)
jave. web

29

Ates, giải pháp của bạn không bảo vệ chống lại một chuỗi trống làm đầu vào. Trong trường hợp đó, nó thất bại với TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties.

bobince, đây là phiên bản của nickf xử lý các dấu phân cách đường dẫn DOS, POSIX và HFS (và chuỗi rỗng):

return fullPath.replace(/^.*(\\|\/|\:)/, '');

4
nếu chúng ta viết mã JS này bằng PHP, chúng ta cần thêm một \ cho mỗi \
Lenin Raj Rajasekaran

17

Dòng mã JavaScript sau đây sẽ cung cấp cho bạn tên tệp.

var z = location.pathname.substring(location.pathname.lastIndexOf('/')+1);
alert(z);

10

Không ngắn gọn hơn câu trả lời của nickf , nhưng câu trả lời này trực tiếp "trích xuất" câu trả lời thay vì thay thế các phần không mong muốn bằng một chuỗi trống:

var filename = /([^\\]+)$/.exec(fullPath)[1];

8

Một câu hỏi yêu cầu "lấy tên tệp mà không cần gia hạn" tham khảo tại đây nhưng không có giải pháp nào cho việc đó. Đây là giải pháp được sửa đổi từ giải pháp của Bobbie.

var name_without_ext = (file_name.split('\\').pop().split('/').pop().split('.'))[0];

6

Một số khác

var filename = fullPath.split(/[\\\/]/).pop();

Ở đây, phần tách có biểu thức chính quy với một lớp
ký tự Hai ký tự phải được thoát bằng '\'

Hoặc sử dụng mảng để phân chia

var filename = fullPath.split(['/','\\']).pop();

Nó sẽ là cách để tự động đẩy nhiều dải phân cách vào một mảng, nếu cần.
Nếu fullPathđược đặt rõ ràng bởi một chuỗi trong mã của bạn, nó cần phải thoát khỏi dấu gạch chéo ngược !
Giống"C:\\Documents and Settings\\img\\recycled log.jpg"


3

Tôi sử dụng:

var lastPart = path.replace(/\\$/,'').split('\\').pop();

Nó thay thế cuối cùng \để nó cũng hoạt động với các thư mục.


2
<script type="text/javascript">
    function test()
    {
        var path = "C:/es/h221.txt";
        var pos =path.lastIndexOf( path.charAt( path.indexOf(":")+1) );
        alert("pos=" + pos );
        var filename = path.substring( pos+1);
        alert( filename );
    }
</script>
<form name="InputForm"
      action="page2.asp"
      method="post">
    <P><input type="button" name="b1" value="test file button"
    onClick="test()">
</form>

1

Câu trả lời đầy đủ là:

<html>
    <head>
        <title>Testing File Upload Inputs</title>
        <script type="text/javascript">

        function replaceAll(txt, replace, with_this) {
            return txt.replace(new RegExp(replace, 'g'),with_this);
        }

        function showSrc() {
            document.getElementById("myframe").href = document.getElementById("myfile").value;
            var theexa = document.getElementById("myframe").href.replace("file:///","");
            var path = document.getElementById("myframe").href.replace("file:///","");
            var correctPath = replaceAll(path,"%20"," ");
            alert(correctPath);
        }
        </script>
    </head>
    <body>
        <form method="get" action="#"  >
            <input type="file"
                   id="myfile"
                   onChange="javascript:showSrc();"
                   size="30">
            <br>
            <a href="#" id="myframe"></a>
        </form>
    </body>
</html>

1

Ít chức năng bao gồm trong dự án của bạn để xác định tên tệp từ một đường dẫn đầy đủ cho Windows cũng như các đường dẫn tuyệt đối GNU / Linux & UNIX.

/**
 * @param {String} path Absolute path
 * @return {String} File name
 * @todo argument type checking during runtime
 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf
 * @example basename('/home/johndoe/github/my-package/webpack.config.js') // "webpack.config.js"
 * @example basename('C:\\Users\\johndoe\\github\\my-package\\webpack.config.js') // "webpack.config.js"
 */
function basename(path) {
  let separator = '/'

  const windowsSeparator = '\\'

  if (path.includes(windowsSeparator)) {
    separator = windowsSeparator
  }

  return path.slice(path.lastIndexOf(separator) + 1)
}

0
<html>
    <head>
        <title>Testing File Upload Inputs</title>
        <script type="text/javascript">
            <!--
            function showSrc() {
                document.getElementById("myframe").href = document.getElementById("myfile").value;
                var theexa = document.getElementById("myframe").href.replace("file:///","");
                alert(document.getElementById("myframe").href.replace("file:///",""));
            }
            // -->
        </script>
    </head>
    <body>
        <form method="get" action="#"  >
            <input type="file" 
                   id="myfile" 
                   onChange="javascript:showSrc();" 
                   size="30">
            <br>
            <a href="#" id="myframe"></a>
        </form>
    </body>
</html>

1
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Ferrybig

0

Script thành công cho câu hỏi của bạn, Kiểm tra đầy đủ

<script src="~/Scripts/jquery-1.10.2.min.js"></script>

<p  title="text" id="FileNameShow" ></p>
<input type="file"
   id="myfile"
   onchange="javascript:showSrc();"
   size="30">


<script type="text/javascript">

function replaceAll(txt, replace, with_this) {
    return txt.replace(new RegExp(replace, 'g'), with_this);
}

function showSrc() {
    document.getElementById("myframe").href = document.getElementById("myfile").value;
    var theexa = document.getElementById("myframe").href.replace("file:///", "");
    var path = document.getElementById("myframe").href.replace("file:///", "");
    var correctPath = replaceAll(path, "%20", " ");
   alert(correctPath);
    var filename = correctPath.replace(/^.*[\\\/]/, '')
    $("#FileNameShow").text(filename)
}


0

Giải pháp này đơn giản và chung chung hơn nhiều, cho cả 'tên tệp' và 'đường dẫn'.

const str = 'C:\\Documents and Settings\\img\\recycled log.jpg';

// regex to split path to two groups '(.*[\\\/])' for path and '(.*)' for file name
const regexPath = /^(.*[\\\/])(.*)$/;

// execute the match on the string str
const match = regexPath.exec(str);
if (match !== null) {
    // we ignore the match[0] because it's the match for the hole path string
    const filePath = match[1];
    const fileName = match[2];
}

Chất lượng của một câu trả lời có thể được cải thiện bằng cách thêm một số giải thích vào mã của bạn. Một số người tìm kiếm câu trả lời này có thể chưa quen với mã hóa, hoặc các biểu thức thông thường và một ít văn bản để cung cấp ngữ cảnh sẽ đi một chặng đường dài để giúp hiểu.
jmarkmurphy

hy vọng cách này tốt hơn :)
Hicham

-3
function getFileName(path, isExtension){

  var fullFileName, fileNameWithoutExtension;

  // replace \ to /
  while( path.indexOf("\\") !== -1 ){
    path = path.replace("\\", "/");
  }

  fullFileName = path.split("/").pop();
  return (isExtension) ? fullFileName : fullFileName.slice( 0, fullFileName.lastIndexOf(".") );
}

-3

var file_name = file_path.substring(file_path.lastIndexOf('/'));

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.