缩短 URL 以保留开头和结尾(Firebug “Net” 面板样式)

Shorten URL for display with beginning and end preserved (Firebug 'Net' panel style)

本文关键字:Net 样式 Firebug URL 保留 开头 结尾 缩短      更新时间:2023-09-26

我想在表中显示一个URL,同时将其限制为特定的长度。作为一个URL,最好保留最有意义的部分,这些部分往往是开头和结尾。在Firebug"Net"面板中查看长URL时可以看到此功能。

这是一个快速而肮脏的解决方案,但到目前为止它对我来说效果很好,可以很容易地更新为任何个人偏好。它分为两个函数,以实现可读性和重用性。

此函数利用如下所示的shortString函数。它将 URL 缩短为小于或等于指定的长度 (l),同时保留 URL 的开头和结尾,并在首选字符 (' ', '/', '&') 处截断。

function shortUrl(url, l){
    var l = typeof(l) != "undefined" ? l : 50;
    var chunk_l = (l/2);
    var url = url.replace("http://","").replace("https://","");
    if(url.length <= l){ return url; }
    var start_chunk = shortString(url, chunk_l, false);
    var end_chunk = shortString(url, chunk_l, true);
    return start_chunk + ".." + end_chunk;
}

此函数从字符串的开头开始(或结尾,如果 reverse=true),一旦达到可接受的长度,就开始查找要截断的首选停止字符。如果在达到指定长度 (l) 之前未找到停止字符,则返回的字符串将截断为最大长度。

function shortString(s, l, reverse){
    var stop_chars = [' ','/', '&'];
    var acceptable_shortness = l * 0.80; // When to start looking for stop characters
    var reverse = typeof(reverse) != "undefined" ? reverse : false;
    var s = reverse ? s.split("").reverse().join("") : s;
    var short_s = "";
    for(var i=0; i < l-1; i++){
        short_s += s[i];
        if(i >= acceptable_shortness && stop_chars.indexOf(s[i]) >= 0){
            break;
        }
    }
    if(reverse){ return short_s.split("").reverse().join(""); }
    return short_s;
}

>>> var url = "http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/"
>>> shortUrl(url)
"blog.stackoverflow.com/..swer-your-own-questions/"

我有一个非常简单的解决方案。 我对仪表板页面也有类似的要求:

"我们需要一个 URL 缩短器函数,它返回一个 50 个字符的字符串,开头没有 http 或 https,包括 32 个字符,然后是一个省略号,然后是最后 15 个字符。"

因此,shortUrl 函数需要接收长 URL,获取最后 15 个字符 - 从长 url 的长度(与最后一个字符相同)减去 15 的切片中获取切片的开头到结尾。 剪掉 http/https start - 我使用了 replace(),获取接下来的 32 个字符 - substr(),然后返回新的开始 + 省略号 (...) + 结束:

 var shortUrl = function(u) {
       uend = u.slice(u.length - 15);
       ustart = u.replace('http://', '').replace('https://', '').substr(0, 32);
       var shorter = ustart + '...' + uend;
       alert(shorter);
       return shorter;
     }
     var longUrl = 'http://www.somekoolsite.com/subsite/subsubsite/morefolders/andetc/page.php';
     shortUrl(longUrl);
     // Result: "www.somekoolsite.com/subsite/sub...andetc/page.php"

我创建了一个适用于 url 和 url 编码的本地文件路径的方法。

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

一些例子:

pathShorten("http://ok.some-bookshop.co.uk/books/horror/find.php?q=urge",35,false)
"http://ok.s...orror/find.php?q=urge"
pathShorten("http://ok.some-bookshop.co.uk/books/horror/find.php?q=urge",35,true)
"http://ok.some-book...books/horror/"
pathShorten("file:///C:/Users/johpan/OneDrive/Shared%20favorites/show must go on.mp3",55,false)
"file:///C:/Users/jo...d%20favorites/show must go on.mp3"
pathShorten("file:///C:/Users/johpan/OneDrive/Shared%20favorites/show must go on.mp3",55,true)
"file:///C:/Users/johpan/OneDr...ive/Shared%20favorites/"