Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何在不接触文件名的情况下截断字符串(包含路径)?_Jquery_String_Filepath_Truncate - Fatal编程技术网

Jquery 如何在不接触文件名的情况下截断字符串(包含路径)?

Jquery 如何在不接触文件名的情况下截断字符串(包含路径)?,jquery,string,filepath,truncate,Jquery,String,Filepath,Truncate,如何在不接触文件名的情况下截断字符串(包含路径)(保留最后一个文件夹、文件名和驱动器号)? 嗨, 我正在寻找一种方法来截断一条路径以适应指定的宽度 我已经在SO上搜索了,发现了以下内容: 但它增加了。。。在字符串的末尾。我想有一个类似的功能,但它需要保持开始和结束 例如,我有以下路径(字符串): H:\Informatique\Personnalisation\Icones\__\Crystal GT PNG Pack\Applications\licq.png D:\A___VERY___

如何在不接触文件名的情况下截断字符串(包含路径)(保留最后一个文件夹、文件名和驱动器号)?

嗨, 我正在寻找一种方法来截断一条路径以适应指定的宽度

我已经在SO上搜索了,发现了以下内容:

但它增加了。。。在字符串的末尾。我想有一个类似的功能,但它需要保持开始和结束

例如,我有以下路径(字符串):

H:\Informatique\Personnalisation\Icones\__\Crystal GT PNG Pack\Applications\licq.png
D:\A___VERY___________LONG________PATH____________\myfile.png
D:\A___VERY___________LONG________PATH____________\and-a-sub-solder\myfile.png
D:\my____file___________________________name____is___too____________long.png
它需要适合div的宽度,如下所示:

H:\Informatique\...PNG Pack\Applications\licq.png
另一个例子:

H:\Informatique\Personnalisation\Icones\__\Crystal GT PNG Pack\Applications\licq.png
D:\A___VERY___________LONG________PATH____________\myfile.png
D:\A___VERY___________LONG________PATH____________\and-a-sub-solder\myfile.png
D:\my____file___________________________name____is___too____________long.png
将缩短为:

D:\A___VERY___________LONG________PA...\myfile.png
D:\A___VERY________...\and-a-sub-solder\myfile.png
D:\my____file_________..._is___too____________long.png
最后一个示例:

H:\Informatique\Personnalisation\Icones\__\Crystal GT PNG Pack\Applications\licq.png
D:\A___VERY___________LONG________PATH____________\myfile.png
D:\A___VERY___________LONG________PATH____________\and-a-sub-solder\myfile.png
D:\my____file___________________________name____is___too____________long.png
将缩短为:

D:\A___VERY___________LONG________PA...\myfile.png
D:\A___VERY________...\and-a-sub-solder\myfile.png
D:\my____file_________..._is___too____________long.png
限制:

  • 需要驱动部件(H:)
  • 需要文件名和扩展名(licq.png)
  • 如果有多个文件夹,则最后一个文件夹不能被截断,如果所有内容都已被截断,则例外,这是删除的唯一方法 把绳子短一点
  • 如果文件名太长,将其截断在中间。
长文件名示例:

H:\Informatique\Personnalisation\Icones\__\Crystal GT PNG Pack\Applications\licq.png
D:\A___VERY___________LONG________PATH____________\myfile.png
D:\A___VERY___________LONG________PATH____________\and-a-sub-solder\myfile.png
D:\my____file___________________________name____is___too____________long.png
将缩短为:

D:\A___VERY___________LONG________PA...\myfile.png
D:\A___VERY________...\and-a-sub-solder\myfile.png
D:\my____file_________..._is___too____________long.png
我看到windows和苹果公司做得很好。。。但我找不到任何与此相近的脚本

有没有类似脚本的链接,我可以试着调整它? 或者任何想帮我的人?:)


非常感谢

这是一个有趣的问题,以下是我的解决方案:

它假设您有一个包含路径的变量str,以及包含最大字符长度的maxLength

您需要稍微更改代码,因为str是硬编码的,您需要更改maxLength,并且您还需要更改写入信息的位置(它现在只写入body)

注意:如果你的驱动器名+文件名超过了maxLength变量,它只会同时打印这两个变量,即使它们太大

代码,以防您不喜欢JSFIDLE:

$(document).ready(function () {
  var str = "H:\\Informatique\\Personnalisation\\Icones\\__\\Crystal GT PNG Pack\\Applications\\licq.png";
  var maxLength = 25;

  var tokens = str.split("\\");
  var drive = tokens[0];
  var fileName = tokens[tokens.length - 1];
  var len = drive.length + fileName.length;
  //remove the current lenth and also space for 3 dots and 2 slashes
  var remLen = maxLength - len - 5;

  //if remLen < 0, then it will over flow our maxLength to still maintain drive and     filename
  if (remLen > 0) {
    //remove first and last elements from the array
    tokens.splice(0, 1);
    tokens.splice(tokens.length - 1, 1);
    //recreate our path
    var path = tokens.join("\\");
    //handle the case of an odd length
    var lenA = Math.ceil(remLen / 2);
    var lenB = Math.floor(remLen / 2);
    //rebuild the path from beginning and end
    var pathA = path.substring(0, lenA);
    var pathB = path.substring(path.length - lenB);
    path = drive + "\\" + pathA + "..." + pathB + "\\" + fileName;

    //write it out
    $("body").html("Orig. Path: " + str + "<br /><br />" +
      "New Path: " + path + "<br /><br />" +
      "MaxLength: " + maxLength + "<br /><br />" +
      "New Length: " + path.length);
  } else {

    //try and fit our maxlength by taking only drive and filename
    $("body").html("Orig. Path: " + str + "<br /><br />" +
      "New Path: " + drive + "\\" + fileName + "<br /><br />" +
      "MaxLength: " + maxLength + "<br /><br />" +
      "New Length: " + (len + 1) + "<br /><br />");
  }
});
$(文档).ready(函数(){
var str=“H:\\Informatique\\personnalization\\Icones\\\\uuu\\\Crystal GT PNG Pack\\Applications\\licq.PNG”;
var maxLength=25;
var tokens=str.split(\\”;
var驱动器=令牌[0];
var fileName=tokens[tokens.length-1];
var len=drive.length+fileName.length;
//删除当前长度,并留出3个点和2个斜线
var remLen=maxLength-len-5;
//如果remLen<0,那么它将超过maxLength,以保持驱动器和文件名
如果(remLen>0){
//从数组中删除第一个和最后一个元素
标记.拼接(0,1);
令牌.拼接(令牌.长度-1,1);
//重建我们的道路
var path=tokens.join(“\\”);
//处理奇数长度的情况
var lenA=数学单元(remLen/2);
var lenB=数学楼层(remLen/2);
//从头到尾重建路径
var pathA=路径子字符串(0,lenA);
var pathB=path.substring(path.length-lenB);
路径=驱动器+“\\”+路径A+“…”+路径B+“\\”+文件名;
//写出来
$(“body”).html(“原始路径:+str+”

”+ 新路径:“+Path+”

”+ MaxLength:“+MaxLength+”

+ “新长度:”+路径长度); }否则{ //尝试只使用驱动器和文件名来适应我们的maxlength $(“body”).html(“原始路径:+str+”

”+ 新路径:“+drive+”\\“+fileName+”

”+ MaxLength:“+MaxLength+”

+ “新长度:”+(len+1)+“

”); } });
让我为@AlienHoboken的代码添加一个稍微优化的版本。这个版本

  • 适用于字符串中带或不带驱动器的路径
  • 适用于带有/或\分隔符的路径
  • 当我们只需要显示文件夹路径时,可以省略文件名
希望有帮助

function pathShorten(str, maxLength, removeFilename) {
    var splitter = str.indexOf('/')>-1 ? '/' : "\\",
        tokens = str.split(splitter), 
        removeFilename = !!removeFilename,
        maxLength = maxLength || 25,
        drive = str.indexOf(':')>-1 ? tokens[0] : "",  
        fileName = tokens[tokens.length - 1],
        len = removeFilename ? drive.length  : drive.length + fileName.length,    
        remLen = maxLength - len - 5, // remove the current lenth and also space for 3 dots and 2 slashes
        path, lenA, lenB, pathA, pathB;    
    //remove first and last elements from the array
    tokens.splice(0, 1);
    tokens.splice(tokens.length - 1, 1);
    //recreate our path
    path = tokens.join(splitter);
    //handle the case of an odd length
    lenA = Math.ceil(remLen / 2);
    lenB = Math.floor(remLen / 2);
    //rebuild the path from beginning and end
    pathA = path.substring(0, lenA);
    pathB = path.substring(path.length - lenB);
    path = drive + splitter + pathA + "..." + pathB + splitter ;
    path = path + (removeFilename ? "" : fileName); 
    //console.log(tokens, maxLength, drive, fileName, len, remLen, pathA, pathB);
    return path;
}

是否有更具体的规则来截断长文件名?是否有一个规则,当省略号在开始(示例1)、结束(示例2和3)或截断目录/文件名的中间(示例4)时使用?这只是逻辑,如果我们在结尾截断,用户就看不到文件名,在开始时,用户看不到驱动器号。最后一个文件夹通常会告诉用户一些信息。。。程序文件对大多数人来说没有任何意义;)-如果你想要更多的例子,就问吧!美好的太神了我将能够从那开始工作,最终完成我想要完成的任务。感谢AlienHoboken的回答。硬代码不是问题;)没问题。祝你愉快,伙计非常好的代码,但是如果您有像
H:\plopy\licq.png
这样的文件路径,那么您的脚本将生成
H:\plopp…loppy\licq.png
,这可能不是理想的输出。我想,你只需要检查字符串长度是否超过了最大长度,如果不是这样,就返回未触及的字符串。哇,太棒了。当我问这个问题时,有些人笑了,但我上面解释的很简单,它可以防止混淆——它可以让重要信息保持可见。我明天会试试你的版本,我很有兴趣测试一下。谢谢