使用Javascript从URL字符串获取端口[重复]

Posted

技术标签:

【中文标题】使用Javascript从URL字符串获取端口[重复]【英文标题】:Getting port from URL string using Javascript [duplicate] 【发布时间】: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 你对问题的措辞有点令人困惑。添加一些示例输入/输出可能会有所帮助。 【参考方案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 抱歉没有正确看到问题

以上是关于使用Javascript从URL字符串获取端口[重复]的主要内容,如果未能解决你的问题,请参考以下文章

仅获取当前 url 的一部分并使用 javascript 重定向

使用 javascript 从 URL 获取路径和查询字符串

在javascript中获取引荐网址

如何从名称空间的 Django URL 中获取绝对字符串?

javascript 使用vanilla JS从URL查询字符串中获取值

javascript JavaScript从url中获取指定查询字符串的值