私は次のようにフォーマットされた文字列を持っています:path/to/a/filename.txt
次に、このコードから「filename.txt」部分を非常に効率的に削除できるようにする文字列操作を行いたいと思います。つまり、文字列を次のようにしたいのです。path/to/a/
これを行う最も効率的な方法は何ですか?現在、文字列を分割し、最後の要素を除いて別の要素を再接続していますが、これは本当に非効率的な方法だと感じています。これが私の現在の非効率なコードです:
res.getPath = function(file)
{
var elem = file.split("/");
var str = "";
for (var i = 0; i < elem.length-1; i++)
str += elem[i] + "/";
return str;
}
LastIndexOf()を使用して最後のスラッシュの位置を見つけ、substring()でスラッシュの前の部分を取得します。
str.substring(0, str.lastIndexOf("/"));
これはどう:
"path/to/a/filename.txt".split("/").slice(0, -1).join("/")+"/"
function splitPath(path) {
var dirPart, filePart;
path.replace(/^(.*\/)?([^/]*)$/, function(_, dir, file) {
dirPart = dir; filePart = file;
});
return { dirPart: dirPart, filePart: filePart };
}
そこがいい
function getDirname(pathname, separator) {
var parts = pathname.split(separator);
if (parts[parts.length - 1].indexOf('.') > -1) {
return parts.slice(0, -1).join(separator)
}
return pathname;
}
使用法:
var dir = getDirname(url.parse(request.url).pathname, '/');
。
var dir = getDirname(path.join('foo', 'bar', 'text.txt'), path.sep);
これがファイルアップロードフォームのファイル名を処理する場合、HTML5仕様では次のコードを推奨しています。
function extractFilename(path) {
if (path.substr(0, 12) == "C:\\fakepath\\")
return path.substr(12); // modern browser
var x;
x = path.lastIndexOf('/');
if (x >= 0) // Unix-based path
return path.substr(x+1);
x = path.lastIndexOf('\\');
if (x >= 0) // Windows-based path
return path.substr(x+1);
return path; // just the filename
}
参照: http://www.w3.org/TR/html5/number-state.html#file-upload-state http://www.w3.org/TR/html5/forms.html#file-upload-state-(type = file)
test/dir/lib/file- _09.ege.jpg
-予定-test/dir/lib/
file- _09.ege.jpg
-予定-file- _09.ege.jpg
console.log("test - "+getPath('test/dir/lib/file- _09.ege.jpg'));
function getPath(path){
path = path.match(/(^.*[\\\/]|^[^\\\/].*)/i);
if(path != null){
return path[0];
}else{
return false;
}
}
console.log("test - "+getPath('test/dir/lib/file- _09.ege.jpg'));
function getPath(path){
path = path.match(/(^.*[\\\/]|^[^\\\/].*)/i);
if(path != null){
return path[0];
}else{
return false;
}
}