只从字符串中获取完整路径,而不使用前面的url

时间:2018-01-24 13:00:39

标签: javascript

假设我有字符串

"https://www.example.com/example/path.php"

......例如。

我怎么才能从字符串中获取最终路径(所以只有example/path.php)?

我似乎有一些正则表达式,它实现了我正在寻找的东西,然而,它只会摆脱https:。正则表达式适用于www.example.com/example/path.php,但没有别的。

基本上, [原始字符串] - > [新字符串]

  

https://www.example.com/example/path.php - >例如/ path.php

     

www.example.com/example/path.php - >例如/ path.php

     

/example/path.php - >例如/ path.php

     

path.php - > path.php

干杯。

6 个答案:

答案 0 :(得分:2)

你可以这样做(不使用regex或任何API的解决方案):

let exclude = "www.example.com/";
let testURLs = ["https://www.example.com/example/path.php","www.example.com/example/path.php","/example/path.php","/example/example2/path.php","path.php"];

testURLs.forEach(url => {
	console.log(url.substring(url.indexOf(exclude) != -1 ? (url.indexOf(exclude) + exclude.length) : url.indexOf('/') != 0 ? 0 : 1 , url.length))
})

答案 1 :(得分:1)

好的,这是我的理由。适用于http,其他域名,例如.org和更长的网址:

let domainMatch = /[a-z]{3}\.[a-z]{3,32}\.[a-z]{2,3}/,
  testStrings = ["https://www.example.com/example/path.php",
    "www.example.com/example/path.php",
    "/example/path.php",
    "path.php",
    "http://www.example.org/example1/example2/path.php"
  ]


let results = testStrings.map(str => 
  str.split("/")
      .filter(word => word.length && !(word.includes("http") || domainMatch.test(word)))
      .join("/")
)

console.log(results)

答案 2 :(得分:0)

您认为想要的部分究竟是什么?

是从第二个到最后一个/到字符串的结尾吗?

您可以在/上拆分字符串,然后将/之间的最后两部分连接起来。

var parts = window.location.href.split("/");
var result = parts[parts.length-2] + "/" + parts[parts.length-1];

如果您希望删除某些常量部分,可以尝试:

var result = window.location.href.replace("constant part you wish to remove", "");

答案 3 :(得分:0)

您需要找到不属于协议的第一个/,因此如果有//则忽略/,然后只需阅读下一个var urls = ["https://www.example.com/example/path.php", "www.example.com/example/path.php", "/example/path.php", "path.php", "//www.xxx.com", "ftp://www.xxx.com/"]; for (var i = 0; i < urls.length; i++) { var url = urls[i]; // where to read from? var from = url.indexOf("//"); from += (from >= 0 ? 2 : 1); // find the next / beyond that var to = url.indexOf("/", from); // read between, handling the case where / is the last character url = (from > 0 && to < 0) ? "" : url.substr(to + 1); console.log(urls[i], "=>", url); }

&#13;
&#13;
findNearest3 <- function(x, y, z){
  temp <- sort(x[x > z[1] & x < z[2]])
  point <- which(abs(temp-y)==min(abs(temp-y)))
  return(temp[c(point-1, point, point+1)])
}
&#13;
&#13;
&#13;

答案 4 :(得分:-1)

The URL API可以轻松操作以下网址:

&#13;
&#13;
["https://www.example.com/example/path.php", "www.example.com/example/path.php", "/example/path.php", "path.php"]
    .forEach(url => console.log(new URL(url, location.href).pathname));
&#13;
&#13;
&#13;

...虽然在主机名之前错过了方案的网址错误无法正确。

答案 5 :(得分:-1)

与使用URL API(浏览器不完全支持)类似,您可以创建<a>元素并设置href属性,然后从该元素中获取pathname等属性。

对于没有协议的域,此解决方案也会失败,因此您需要进行一些解析/验证。像URI.js这样的图书馆可能会帮助你

如果你知道域/主机应该是什么......那么当<a>不是预期的时候,a.host也很容易检查和设置,同样的a.protocol

&#13;
&#13;
["https://www.example.com/example/path.php", "www.example.com/example/path.php", "/example/path.php", "path.php"]
.forEach(url => {
   var a = document.createElement('a');
   a.setAttribute('href', url)
   console.log(a.pathname.slice(1));
});
&#13;
&#13;
&#13;