如何用 JavaScript 来解析 URL

时间: 2020-07-27阅读: 138标签: url
原文链接:https://dmitripavlutin.com/parse-url-javascript/

统一资源定位符,缩写为URL,是对网络资源(网页、图像、文件)的引用。URL指定资源位置和检索资源的机制(http、ftp、mailto)。

举个例子,这里是这篇文章的 URL 地址:

https://dmitripavlutin.com/parse-url-JavaScript

很多时候你需要获取到一段 URL 的某个组成部分。它们可能是 hostname(例如 dmitripavlutin.com),或者 pathname(例如 /parse-url-JavaScript)。

一个方便的用于获取 URL 组成部分的办法是通过 URL() 构造函数

在这篇文章中,我将给大家展示一段 URL 的结构,以及它的主要组成部分。

接着,我会告诉你如何使用 URL() 构造函数来轻松获取 URL 的组成部分,比如 hostname,pathname,query 或者 hash。


1. URL 结构

一图胜千言。不需要过多的文字描述,通过下面的图片你就可以理解一段 URL 的各个组成部分:



2. URL() 构造函数

URL() 构造函数允许我们用它来解析一段 URL:

const url = new URL(relativeOrAbsolute [, absoluteBase]);

参数 relativeOrAbsolute 既可以是绝对路径,也可以是相对路径。如果第一个参数是相对路径的话,那么第二个参数 absoluteBase 则必传,且必须为第一个参数的绝对路径。

举个例子,让我们用一个绝对路径的 URL 来初始化 URL() 函数

const url = new URL('http://example.com/path/index.html');

url.href; // => 'http://example.com/path/index.html'

或者我们可以使用相对路径和绝对路径:

const url = new URL('/path/index.html', 'http://example.com');

url.href; // => 'http://example.com/path/index.html'

URL() 实例中的 href 属性返回了完整的 URL 字符串。

在新建了 URL() 的实例以后,你可以用它来访问前文图片中的任意 URL 组成部分。作为参考,下面是 URL() 实例的接口列表:

interface URL {
  href:     USVString;
  protocol: USVString;
  username: USVString;
  password: USVString;
  host:     USVString;
  hostname: USVString;
  port:     USVString;
  pathname: USVString;
  search:   USVString;
  hash:     USVString;

  readonly origin: USVString;
  readonly searchParams: URLSearchParams;

  tojsON(): USVString;
}

上述的 USVString 参数在 JavaScript 中会映射成字符串。

3. Query 字符串

url.search 可以获取到 URL 当中 ? 后面的 query 字符串:

const url = new URL(
  'http://example.com/path/index.html?message=hello&who=world'
);

url.search; // => '?message=hello&who=world'

如果 query 参数不存在,url.search 默认会返回一个空字符串 '':

const url1 = new URL('http://example.com/path/index.html');
const url2 = new URL('http://example.com/path/index.html?');

url1.search; // => ''
url2.search; // => ''


3.1 解析 query 字符串

相比于获得原生的 query 字符串,更实用的场景是获取到具体的 query 参数。

获取具体 query 参数的一个简单的方法是利用 url.searchParams 属性。这个属性是 URLSearchParams 的实例。

URLSearchParams 对象提供了许多用于获取 query 参数的方法,如get(param),has(param)等。

下面来看个例子:

const url = new URL(
  'http://example.com/path/index.html?message=hello&who=world'
);

url.searchParams.get('message'); // => 'hello'
url.searchParams.get('missing'); // => null

url.searchParams.get('message') 返回了 message 这个 query 参数的值——hello。

如果使用 url.searchParams.get('missing') 来获取一个不存在的参数,则得到一个 null。


4. hostname

url.hostname 属性返回一段 URL 的 hostname 部分:

const url = new URL('http://example.com/path/index.html');

url.hostname; // => 'example.com'


5. pathname

url. pathname 属性返回一段 URL 的 pathname 部分:

const url = new URL('http://example.com/path/index.html?param=value');

url.pathname; // => '/path/index.html'

如果这段 URL 不含 path,则该属性返回一个斜杠 /:

const url = new URL('http://example.com/');

url.pathname; // => '/'


6. hash

最后,我们可以通过 url.hash 属性来获取 URL 中的 hash 值:

const url = new URL('http://example.com/path/index.html#bottom');

url.hash; // => '#bottom'

当 URL 中的 hash 不存在时,url.hash 属性会返回一个空字符串 '':

const url = new URL('http://example.com/path/index.html');

url.hash; // => ''


7. URL 校验

当使用 new URL() 构造函数来新建实例的时候,作为一种副作用,它同时也会对 URL 进行校验。如果 URL 不合法,则会抛出一个 TypeError。

举个例子,http ://example.com 是一段非法 URL,因为它在 http 后面多写了一个空格。

让我们用这个非法 URL 来初始化 URL() 构造函数

try {
  const url = new URL('http ://example.com');
} catch (error) {
  error; // => TypeError, "Failed to construct URL: Invalid URL"
}

因为 http ://example.com 是一段非法 URL,跟我们想的一样,new URL() 抛出了一个 TypeError。


8. 修改 URL

除了获取 URL 的组成部分以外,像 search,hostname,pathname 和 hash 这些属性都是可写的——这也意味着你可以修改 URL。

举个例子,让我们把一段 URL 从 red.com 修改成 blue.io:

const url = new URL('http://red.com/path/index.html');

url.href; // => 'http://red.com/path/index.html'

url.hostname = 'blue.io';

url.href; // => 'http://blue.io/path/index.html'

注意,在 URL() 实例中只有 origin 和 searchParams 属性是只读的,其他所有的属性都是可写的,并且会修改原来的 URL。


9. 总结

URL() 构造函数JavaScript 中的一个能够很方便地用于解析(或者校验)URL 的工具

new URL(relativeOrAbsolute [, absoluteBase]) 中的第一个参数接收 URL 的绝对路径或者相对路径。当第一个参数是相对路径时,第二个参数必传且必须为第一个参数的基路径。

在新建 URL() 的实例以后,你就能很轻易地获得 URL 当中的大部分组成部分了,比如:

  • url.search 获取原生的 query 字符串
  • url.searchParams 通过 URLSearchParams 的实例去获取具体的 query 参数
  • url.hostname获取 hostname
  • url.pathname 获取 pathname
  • url.hash 获取 hash 值



站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/9527

关闭

使用 <wbr> 解决长 URL 的换行问题

Web 开发中,屏幕宽度有限,超长文字必须换行。在 CSS 中,控制换行的属性主要有 word-break,white-space,其中,默认换行行为的是 word-break: normal,即以单词为单位换行。比较奇怪的是,对于 URL

Js获取URL的协议?

想要获取当前URL的协议,可以使用JavaScript的location.protocol属性。 网络协议定义了网络设备之间通信的规则和约定。通过采用这些规则,两个设备可以相互通信并且可以交换信息。http:超文本传输协议(HTTP)是分布式系统的应用协议。

前后端分离, 前端如何防止直接输入URL进入页面?

前后端分离,如何防止用户直接在地址栏输入url进入页面,也就是判断用户是否登录,没有,则直接跳转到登录页,后台可以用session记录用户登陆的状态,疑问的是前端每次ajax请求,都要做状态判断么

html 获取url地址_js获取当前页面的url网址信息汇总

在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结。window.location.href(设置或获取整个 URL 为字符串),window.location.protocol(设置或获取 URL 的协议部分)

window.URL对象的使用方式

window对象的URL对象是专门用来将blob或者file读取成一个url的。这个url可以用在html的任何可以使用url的地方,比如img的src ; audio/video的src和source标签等。

PHP利用get_headers()函数判断远程的url地址是否有效

利用url访问远程的文件、图片、视频时有时需要请求前判断url地址是否有效。利用PHP自带的函数get_headers(),利用http返回值是否存在200状态,来判断url地址是否有效。

URL和URI

URL只是URI的一个子集,http://abc.jsp就是一个URL,URI 是 Uniform Resource Identifier 的缩写。RFC2396 分别对这 3 个单词进行了如下定义。Uniform规定统一的格式可方便处理多种不同类型的资源

动态url、静态url和伪静态url的详细讲解

关于url的动态、静态、伪静态,很多站长朋友,尤其是新站长一直搞不清楚。网上的许多解释又语焉不详,下面就作详细的讲解下。

从输入URL到页面加载发生了什么?

输入URL到页面加载发生了什么?通过连接这个过程,然后针对性地对每个过程进行优化,最终实现的就是我们的前端性能优化。本篇文章主要介绍一些基础性的概念,很少涉及真正的性能优化。

聊一聊 JavaScript 的 URL 对象是什么?

如果我们自己编写从URL中分析和提取元素的代码,那么有可能会比较痛苦和麻烦。程序员作为这个社会中最“懒”的群体之一,无休止的重复造轮子必然是令人难以容忍的,所以大多数浏览器的标准库中都已经内置了URL对象。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广