【问题标题】:Getting port from URL string using Javascript [duplicate]使用Javascript从URL字符串获取端口[重复]
【发布时间】:2015-07-02 14:29:12
【问题描述】:

我想要一个 javascript 中的函数,它将作为参数获取一个 url,并返回该 URL 的端口,如下所示:

  • 如果有 httphttps (端口 80 / 443),它将不会显示在 url 结构中,但我希望它们返回。
  • 如果有其他端口,我希望将其退回。

例子:

function myFunction(url){
    something here
    ...
    return port
}

我已经看到使用一些额外的库可以很容易地做到这一点,但我不想使用一个。从现在开始我没有使用 js,如果有人也能够解释他的解决方案,我将不胜感激。

【问题讨论】:

  • 我在浏览器中使用它,并且我已经将该 URL 作为字符串,所以我不想从其他任何地方获取它。如果可能的话,我只想解释功能
  • 还有其他方法可以简单地从 URL 中获取 portprotocal,例如 window.document.location.portwindow.document.location.protocol 或简单的 location.portlocation.protocal
  • 你对问题的措辞有点令人困惑。添加一些示例输入/输出可能会有所帮助。

标签: javascript regex


【解决方案1】:

据我所知,您不想使用 location 作为 URL 来减去端口,而只是使用任何字符串作为 URL。好吧,对于这种情况,我想出了这个。这个函数可以接受任何字符串(但无论如何你都可以将location URL 传递给它,它的工作原理是一样的):

function getPort(url) {
    url = url.match(/^(([a-z]+:)?(\/\/)?[^\/]+).*$/)[1] || url;
    var parts = url.split(':'),
        port = parseInt(parts[parts.length - 1], 10);
    if(parts[0] === 'http' && (isNaN(port) || parts.length < 3)) {
        return 80;
    }
    if(parts[0] === 'https' && (isNaN(port) || parts.length < 3)) {
        return 443;
    }
    if(parts.length === 1 || isNaN(port)) return 80;
    return port;
}
  • 它从字符串中获取基本 url。
  • 它将基本 url 拆分为多个部分,':'
  • 它尝试将端口的仅数字部分(parts 数组的最后一个元素)解析为整数。
  • 如果 URL 以 'http' 开头 AND 端口不是数字或 URL 部分数组的长度小于 3(这意味着 URL 字符串中没有隐含端口),它返回默认的 HTTP 端口。
  • 'https' 也是如此。
  • 如果长度为1,则表示未提供协议或端口。在这种情况下或者端口不是数字的情况下(同样,没有提供协议),返回默认的HTTP 端口。
  • 如果它通过了所有这些测试,那么它只会在函数的开头返回它尝试解析为整数的端口。

【讨论】:

  • 谢谢。我会试试看。
  • 没问题。如果出现任何问题,请告诉我们(如果没有出现问题!)。
  • 我试过了,它适用于 http 和 https,但是当我添加一个链接为 http://www.something.com:88/something?id=test 时,它只是在端口末尾放置一个 1,所以结果输出将是:@ 987654332@ 而不是 88。任何提示
  • 好的,感谢您指出这一点。我更新了代码。我认为现在已经涵盖了这种情况:p。如果parts数组的长度超过3,则取索引2处的元素,否则取最后一个元素。我还稍微更新了正则表达式(与上一个相比)。这应该很好用。
  • 事实上我刚刚遇到了另一种情况:如果:https://www.get.example.com/elance?something=123?id:135456&amp;something:15 怎么办?它应该返回443,但它返回135456
【解决方案2】:

这是一个基于正则表达式的解决方案(正则表达式不是防弹的):

var urls = [
  "http://localhost/path/",
  "https://localhost/",
  "http://localhost:8080",
  "https://localhost:8443/path",
  "ftp://localhost/"
];
var i;
for (i = 0; i < urls.length; i++) {
  console.log(urls[i], getPortFromURL(urls[i]));
}

function getPortFromURL(url) {
  var regex = /^(http|https):\/\/[^:\/]+(?::(\d+))?/;
  var match = url.match(regex);
  if (match === null) {
    return null;
  } else {
    return match[2] ? match[2] : {http: "80", https: "443"}[match[1]];
  }
}
&lt;!-- nothing here, see console --&gt;

【讨论】:

  • Thnaks,我也试试这个,但它必须是一个以 URL 作为参数的函数
【解决方案3】:

希望下面的代码会有所帮助

function getPort(){
var port==location.port;
if(port=="")
{
if(location.protocol=="http:")
  return "80";
else
  return "443";
return port;
}

【讨论】:

  • OP 想要一个函数来处理作为参数传递给它的 URL,而不是当前页面。
  • 请不要只回答代码。始终解释重点。
  • @UselessCode 抱歉没有正确看到问题
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多