是否有一种方法,我可以得到的最后一个值(基于'\'符号)从一个完整的路径?

例子:

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

在这种情况下,我只想从JavaScript的完整路径中回收log.jpg。


当前回答

完整的答案是:

<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>

其他回答

不需要专门处理反斜杠;大多数答案不处理搜索参数。

现代的方法是简单地使用URL API并获取pathname属性。API将反斜杠规范化为斜杠。注意,位置(在浏览器环境中)也可以工作,但仅适用于当前URL,而不是任意URL。

为了将结果%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; }

如果你总是想要路径的最后一个非空部分(例如,来自https://example.com/file.png/的file.png),在.pop()之前添加一个.filter(布尔值)。

如果您只有一个相对URL,但仍然只想获得文件名,则使用URL构造函数的第二个参数来传递基源。“https://example.com”足够:新的URL(文件名,“https://example.com”)。也可以在你的文件名前加上“https://”——URL构造函数接受https://path/to/file.ext作为有效的URL。

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

这将处理两个\ OR / in路径

路径来自哪个平台?Windows路径不同POSIX路径不同Mac OS 9路径不同RISC OS路径不同…

如果它是一个web应用程序,文件名可以来自不同的平台,那么就没有一个解决方案。然而,一个合理的尝试是同时使用'\' (Windows)和'/' (Linux/Unix/Mac和Windows上的另一种选择)作为路径分隔符。下面是一个非regexp版本的额外乐趣:

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

这个解决方案对'fileName'和'path'都更简单和通用。

parsePath = (path) => {
    // regex to split path (untile last / or \ to two groups '(.*[\\\/])' for path and '(.*)' (untile the end after the \ or / )for file name
    const regexPath = /^(?<path>(.*[\\\/])?)(?<filename>.*)$/;

    const match = regexPath.exec(path);
    if (path && match) {
        return {
            path: match.groups.path,
            filename: match.groups.filename
        }
    }
    throw Error("Error parsing path");
}

// example
const str = 'C:\\Documents and Settings\\img\\recycled log.jpg';
parsePath(str);

一个问题问“获取没有扩展名的文件名”参考这里,但没有解决方案。 这是由博比的溶液改进而来的溶液。

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