使用Javascript从URL字符串获取端口[重复]
Posted
技术标签:
【中文标题】使用Javascript从URL字符串获取端口[重复]【英文标题】:Getting port from URL string using Javascript [duplicate] 【发布时间】:2015-07-02 14:29:12 【问题描述】:我想要一个 javascript 中的函数,它将作为参数获取一个 url,并将返回该 URL 的端口,如下所示:
如果有http
或 https
(端口 80 / 443),它将不会显示在 url 结构中,但我还是希望它们返回。
如果有其他端口,我希望将其退回。
例子:
function myFunction(url)
something here
...
return port
我已经看到使用一些额外的库可以很容易地做到这一点,但我不想使用一个。从现在开始我没有使用 js,如果有人也能够解释他的解决方案,我将非常感激。
【问题讨论】:
我在浏览器中使用它,并且我已经将该 URL 作为字符串,所以我不想从其他任何地方获取它。如果可能的话,我只想解释功能 还有其他方法可以简单地从 URL 中获取port
和 protocal
,例如 window.document.location.port
和 window.document.location.protocol
或简单的 location.port
和 location.protocal
你对问题的措辞有点令人困惑。添加一些示例输入/输出可能会有所帮助。
【参考方案1】:
据我所知,您不想使用location
作为从 URL 中减去端口的 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&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]];
<!-- nothing here, see console -->
【讨论】:
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 获取路径和查询字符串