单个正则表达式以获取页面URL但从完整URL中排除端口号

时间:2014-09-28 01:00:23

标签: javascript regex url

我试图想出一个正则表达式来从完整的URL获取页面URL,但是从中排除了一个可能的端口号。到目前为止,我提出了以下JS:

var res = url.match(/^.*\:\/\/(?:www2?.)?([^?#]+)/i);
if(res)
{
    var pageURL = res[1];
    console.log(pageURL);
}

如果我这样称呼它:

var url = "http://www.example.com/php/page.php?what=sw#print";

我得到了正确答案:example.com/php/page.php

但如果我这样做:

var url = "http://www.example.com:80/php/page.php?what=sw#print";

我需要它返回example.com/php/page.php而不是example.com:80/php/page.php

我可以用第二个正则表达式删除它,但我很好奇我是否可以只使用一个(速度)?

6 个答案:

答案 0 :(得分:3)

您可以将正则表达式修改为:

/^.*\:\/\/(?:www2?.)?([^/:]+)(?:[^:]*:\d+)?([^?#]+)/i

RegEx Demo

它将返回2场比赛:

1: example.com
2: /php/page.php
对于您可以连接的两个输入,

分别为match[1]match[2]

http://www.example.com/php/page.php?what=sw#print

OR

http://www.example.com:80/php/page.php?what=sw#print

更新:以下 performance results on jsperf.com 显示正则表达式方法最快

答案 1 :(得分:0)

为什么要使用正则表达式?


修改

正如@ c00000fd所指出的那样:因为document可能不可用而且document.createElement与RegExp相比非常慢 - 请参阅:

http://jsperf.com/url-parsing/5

http://jsperf.com/hostname-from-url

尽管如此,我会留下原始答案以供参考。


原始答案:

相反,您可以使用Anchor元素:

<强>小提琴:

http://jsfiddle.net/12qjqx7n/

<强> JS:

var url = 'http://foo:bar@www.example.com:8080/php/page.php?what=sw#print'
var a = document.createElement('a');
a.href = url;

console.log(a.hash);
console.log(a.host);
console.log(a.hostname);
console.log(a.origin);
console.log(a.password);
console.log(a.pathname);
console.log(a.port);
console.log(a.protocol);
console.log(a.search);
console.log(a.username);

其他信息:

http://www.w3schools.com/jsref/dom_obj_anchor.asp

答案 2 :(得分:0)

保持简单:

~ node 
> "http://www.example.com:3000/php/page.php?what=sw#print".replace(/:\d+/, '');
'http://www.example.com/php/page.php?what=sw#print'
> "http://www.example.com/php/page.php?what=sw#print".replace(/:\d+/, '');
'http://www.example.com/php/page.php?what=sw#print'

答案 3 :(得分:0)

匹配端口的组如果存在,该如何?

var url = "http://www.example.com:80/php/page.php?what=sw#print";
var res = url.match(/^.*\:\/\/(?:www2?.)?([^?#\/:]+)(\:\d+)?(\/[^?#]+)/i);
if(res)
{
    var pageURL = res[1]+res[3];
    console.log(res, pageURL);
}

答案 4 :(得分:0)

尝试

var url = "http://www.example.com:80/php/page.php?what=sw#print";
var res = url.split(/\w+:\/\/+\w+\.|:+\d+|\?.*/).join("");

var url = "http://www.example.com:80/php/page.php?what=sw#print";
var res = url.split(/\w+:\/\/+\w+\.|:+\d+|\?.*/).join("");
document.body.innerText = res;
    

答案 5 :(得分:0)

您可以使用替换方法修改原始字符串或网址

> var url = "http://www.example.com/php/page.php?what=sw#print";
undefined
> var url1 = "http://www.example.com:80/php/page.php?what=sw#print";
undefined
> url.replace(/^.*?:\/\/(?:www2?.)?([^/:]+)(?::\d+)?([^?#]+).*$/g, "$1$2")
'example.com/php/page.php'
> url1.replace(/^.*?:\/\/(?:www2?.)?([^/:]+)(?::\d+)?([^?#]+).*$/g, "$1$2")
'example.com/php/page.php'

DEMO