2017-08-25 78 views
1

假设我们有以下网址:的Javascript:有选择地删除从URL中的散列(或散列),从而使URL仍然有效或可用

1. http://example.com#hash0 
2. http://example.com#hash0#hash1 
3. http://example.com#hash0/sample.net/ 
4. http://example.com#hash0/sample.net/#hash1 
5. http://example.com#hash0/image.jpg 
6. http://example.com#hash0/image.jpg#hash1 
7. something.php#?type=abc&id=123 
8. something.php#?type=abc&id=123#hash0 
9. something.php/?type=abc&id=#123 
.................................... 

多这样的排列,你得到了点。如何从这类URL中选择性地移除“无关”哈希而不是影响这些URL的功能(以便它们仍然是完整链接或图像)?

例如,从这个列表中的数字1开始,我希望从#3 hash0和#hash1的2中删除#hash0,从3开始我想保留它,因为它后面跟着路径的延续(是的,这是可能的,检查here),从4删除#hash1,从5保留它,但从6删除#hash1,...,从9我认为保留它,因为它可能与查询有关(虽然不确定),依此类推。基本上我希望只删除那些没有任何可用的散列(如路径,查询,图像文件等) - 像#top,#bottom等“无关”散列指的是当前页面。我正在研究的东西,也涉及从相对的获取绝对URL(借助于新的锚点的href或新的URL对象的href),所以一个解决方案(如here),可以“融入”与location object's properties(如。协议,。主机,.pathname,。搜索,.hash等)是更可取的 - 因为它可能是更“可信”,因为它是内置的,但一个好的(和更短的)正则表达式是可以接受的以及。总而言之,较短的解决方案是可取的,因为我不希望我的项目为分析整个当前URL时遇到的每个链接或图像链接做额外的不必要的工作。

+0

你怎么知道哪个散列 “无关”?他们改变了吗?我首先看'String.replace()' – mhodges

+0

@mhodges Hashes后面没有有效的路径/查询/图像链接部分在我的情况下是“无关紧要的”。例如,3,5或7(甚至9)的散列值或4,6或8中的第一个散列值是相关的,因为它们之后是“哈希”以外的URL部分。 –

回答

1

也许这是你想要的,用一个正则表达式。

var urls = [ 
 
     'http://example.com#hash0',     // remove 
 
     'http://example.com#hash0#hash1',    // remove 
 
     'http://example.com#hash0/sample.net/',  // keep 
 
     'http://example.com#hash0/sample.net/#hash1', // remove #hash1 
 
     'http://example.com#hash0/image.jpg',   // keep 
 
     'http://example.com#hash0/image.jpg#hash1', // remove #hash1 
 
     'something.php#?type=abc&id=123',    // keep 
 
     'something.php#?type=abc&id=123#hash0',  // remove #hash0 
 
     'something.php/?type=abc&id=#123',   // remove #123 
 
    ], 
 
    result = urls.map(h => h.replace(/(?:#[^#\/\?\.]*)*#[^#\/\?\.]*$/gi, '')); 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

是的,这也是我的想法,但它也需要包括潜在的有效查询或图像... –

+0

问题是,除非您不指定白名单或黑名单,否则任何解决方案只是一个尝试。 –

+0

我知道 - 这就是为什么我在这里问这个问题。如果我确实有防弹解决方案,我不会问);但是,我在我的问题中解释了一般“白名单”的外观:有效路径,有效查询,有效图像等。基本上任何不是“简单哈希”的东西。如果我可以将可用的散列作为URL自己处理,我可以简单地分析每个散列以查找其他相关的部分,并排除不包含这些部分的散列(例如_h = location.hash; if((h.path = ==“”)&&(h.search ===“”)&&(!h.endsWith(“。jpg”))){h =“”;} _)等等。 –