有没有办法可以从完整路径获取最后一个值(基于'\'符号)?
示例:
C:\Documents and Settings\img\recycled log.jpg
在这种情况下,我只想从JavaScript的完整路径中获取recycled log.jpg
。
答案 0 :(得分:606)
var filename = fullPath.replace(/^.*[\\\/]/, '')
这将处理\ OR / in path
答案 1 :(得分:86)
为了表现,我测试了这里给出的所有答案:
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
获胜者是分裂和流行风格的答案,感谢 bobince !
答案 2 :(得分:58)
路径来自哪个平台? Windows路径不同于POSIX路径不同于Mac OS 9路径不同于RISC OS路径不同......
如果它是一个Web应用程序,其中文件名可以来自不同的平台,则没有一个解决方案。然而,合理的尝试是使用'\'(Windows)和'/'(Linux / Unix / Mac以及Windows上的替代方案)作为路径分隔符。这是一个非RegExp版本,可以带来额外的乐趣:
var leafname= pathname.split('\\').pop().split('/').pop();
答案 3 :(得分:52)
在Node.js中,您可以使用Path's parse module ...
var path = require('path');
var file = '/home/user/dir/file.txt';
var filename = path.parse(file).base;
//=> 'file.txt'
答案 4 :(得分:27)
Ates,您的解决方案无法防止空字符串作为输入。在这种情况下,它失败了TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties
。
bobince,这是一个处理DOS,POSIX和HFS路径分隔符(和空字符串)的nickf版本:
return fullPath.replace(/^.*(\\|\/|\:)/, '');
答案 5 :(得分:16)
以下JavaScript代码行将为您提供文件名。
var z = location.pathname.substring(location.pathname.lastIndexOf('/')+1);
alert(z);
答案 6 :(得分:10)
不比nickf的answer更简洁,但是这个直接“提取”答案而不是用空字符串替换不需要的部分:
var filename = /([^\\]+)$/.exec(fullPath)[1];
答案 7 :(得分:8)
询问“获取没有扩展名的文件名”的问题请参考此处,但没有解决方法。 以下是Bobbie解决方案修改的解决方案。
var name_without_ext = (file_name.split('\\').pop().split('/').pop().split('.'))[0];
答案 8 :(得分:2)
不需要特别处理反斜杠;大多数答案不处理搜索参数。
现代方法是简单地使用 URL
API 并获取 pathname
属性。 API 将反斜杠规范化为斜杠。
为了将结果 %20
解析为空格,只需将其传递给 decodeURIComponent
。
const getFileName = (fileName) => new URL(fileName).pathname.split("/").pop();
// URLs need to have the scheme portion, e.g. `file://` or `https://`.
console.log(getFileName("file://C:\\Documents and Settings\\img\\recycled log.jpg")); // "recycled%20log.jpg"
console.log(decodeURIComponent(getFileName("file://C:\\Documents and Settings\\img\\recycled log.jpg"))); // "recycled log.jpg"
console.log(getFileName("https://example.com:443/path/to/file.png?size=480")); // "file.png"
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果您总是希望路径的最后一个非空部分(例如 .filter(Boolean)
来自 .pop()
).
如果您只有一个相对 URL 但仍然只想获取文件名,请使用 second argument of the URL
constructor 传递基本来源。 file.png
就足够了:https://example.com/file.png/
。也可以在您的 "https://example.com"
— new URL(fileName, "https://example.com")
构造函数接受 "https://"
作为有效 URL 之前添加 fileName
。
答案 9 :(得分:2)
我用:
var lastPart = path.replace(/\\$/,'').split('\\').pop();
它取代了最后一个\
,因此它也适用于文件夹。
答案 10 :(得分: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>
答案 11 :(得分:1)
完整的答案是:
<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>
答案 12 :(得分:1)
项目中没有什么功能可从Windows的完整路径以及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)
}
答案 13 :(得分:1)
另一个
var filename = fullPath.split(/[\\\/]/).pop();
split的正则表达式带有character class
这两个字符必须用'\'
这个有一个array to split。
var filename = fullPath.split(['/','\\']).pop();
如果需要,可以轻松将分隔符推入数组中!
如果您在程序中编写字符串,则需要escape the backslash!
像"C:\\Documents and Settings\\img\\recycled log.jpg"
答案 14 :(得分:0)
成功编写问题脚本,完整测试
<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)
}
答案 15 :(得分: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>
答案 16 :(得分:0)
对于“文件名”和“路径”,此解决方案都更加简单和通用。
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];
}
答案 17 :(得分:-3)
var file_name = file_path.substring(file_path.lastIndexOf('/'));
答案 18 :(得分:-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(".") );
}
答案 19 :(得分:-8)
<script type="text\javascript">
var path = '<%=Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath %>';
</script>