HTML–实体编码
众所周知,人类所使用的文字是不能直接和计算机进行互通的,需要通过编码才能转换为计算机能够识别的内容,而网页中包含了大量的文字,浏览器要想读懂这些文字,就必须要先知道它们的编码方法。由此,服务器在向浏览器发送HTML文件时,会通过HTTP头信息,声明网页的编码方式。
Content-type:text/html;charset=UTF-8
上述HTTP头文件代码就声明了服务器发送的数据类型时text/html(即HTML网页),然后声明网页的文字编码时UTF-8。
其次在网页内部也会再用标签声明网页的编码
<meta charset="UST-8"
虽然HTML用的时UTF-8的编码方式,但是由于Unicode中的字符集实在是太多了,包括了很多HTML语言里没有对应的字面形式的以及THML中的保留字符等,所以HTML还制定了一套实体编码(entity encoding)的简单编码策略。
即:
- HTML实体编码格式全部为
以&开头 以;结尾
- 与ASCII编码对照将字符转化为对应的十进制或十六进制
- Unicode字符编码,格式:
以符号&#开头,分号;结尾
例:
<p style="color: red;" >hello! </p >
在浏览器中打印的结果:
<p style="color: red;" >hello! </p >
**注:**HTML实体编码不能用于JavaScript
状态码
HTTP[状态码](HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。
状态码 | 类别 | 原因 |
---|---|---|
1xx | Informational(信息性状态码) | 接受的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作已完成请求 |
4xx | Client Error(客户端错误状态码) | 客户端无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求错误 |
状态码 | 状态 | 相应含义 |
---|---|---|
200 | 成功 | 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页 |
201 | 已创建 | 请求成功并且服务器创建了新的资源 |
202 | 已接受 | 服务器以接受请求,但尚未处理 |
203 | 非授权信息 | 服务器已成功处理了请求,但返回的信息可能来自另一来源 |
204 | 无内容 | 服务器成功处理了请求,但没有返回任何内容 |
205 | 重置内容 | 服务器成功处理了请求,但没有返回任何内容 |
206 | 部分内容 | 服务器成功处理了部分GET请求 |
300 | 多种选择 | 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择 |
301 | 永久移动 | 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置 |
302 | 重定向 | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
303 | 查看其他位置 | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码 |
304 | 未修改(请求缓存) | 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容 |
305 | 使用代理 | 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理 |
307 | 临时重定向 | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
400 | 错误请求 | 服务器不理解请求的语法 |
401 | 未授权 | 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应 |
403 | 禁止 | 服务器拒绝请求 |
404 | 未找到 | 服务器找不到请求的网页 |
405 | 方法禁用 | 禁用请求中指定的方法 |
406 | 不接受 | 无法使用请求的内容特性响应请求的网页 |
407 | 需要代理授权 | 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理 |
408 | 请求超时 | 服务器等候请求时发生超时 |
409 | 冲突 | 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息 |
410 | 已删除 | 如果请求的资源已永久删除,服务器就会返回此响应 |
411 | 需要有效长度 | 服务器不接受不含有效内容长度标头字段的请求 |
412 | 未满足前提条件 | 服务器未满足请求者在请求中设置的其中一个前提条件 |
413 | 请求实体过大 | 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力 |
414 | 请求的 URI 过长 | 求的 URI(通常为网址)过长,服务器无法处理 |
415 | 不支持的媒体类型 | 请求的格式不受请求页面的支持 |
416 | 请求范围不符合要求 | 如果页面无法提供请求的范围,则服务器会返回此状态代码 |
417 | 未满足期望值 | 服务器未满足"期望"请求标头字段的要求 |
500 | 服务器内部错误 | 服务器遇到错误,无法完成请求 |
501 | 尚未实施 | 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码 |
502 | 错误网关 | 服务器作为网关或代理,从上游服务器收到无效响应 |
503 | 服务不可用 | 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态 |
504 | 网关超时 | 服务器作为网关或代理,但是没有及时从上游服务器收到请求 |
505 | HTTP 版本不受支持 | 服务器不支持请求中所用的 HTTP 协议版本 |
重点
方法 | 缓存(永久重定向) | 不缓存(临时重定向) |
---|---|---|
转GET | 301 | 302、303 |
方法保持 | 308 | 307 |
URL编码
什么是URL编码
编码是指将数字和字符通过一定的转换后使其能够在计算机中进行展示的行为,因为计算机只能识别0,1的信号,所以输入计算机中的信息都要转换成0,1串的形式才能被计算机识别。在计算机中,编码的本质是用来保存或者传输信息,但是由于二进制编码太繁琐,所以人们在处理编码的时候通常用十进制或者十六进制表示,如我们所熟知的ASCII码就是用十进制表示字符。
URL编码是浏览器通用的一种编码形式,早期的URL编码是将scope限定在URL中,对URL中的一些字符进行编码。实际应用中,HTTP的body以及header等其他部分都有URL编码的使用。当URL路径或者查询参数中带有中文或者页数字符的时候,就需要对URL进行编码(十六进制编码)。URL的原则是使用安全字符去表示那些不安全字符。
安全字符是指没有特殊用途或者特殊意义的字符。
URL的编码方式
-
组成部分URL是有一些简单的组件构成,比如协议、域名、端口号、路径、查询以及字符串等,如
http://www.ccc.net/index?param=10
-
**协议(scheme)**是浏览器请求服务器资源的方法,上述
http://
表示使用的是http协议。在浏览器支持的多种协议中,默认http
协议,也就是说如果在浏览器地址栏输入网址时没有输入协议,而是直接输入www.ccc.net
,浏览器的访问结果就是http://www.ccc.net
。在当今应用中http大多数时候被认为是不安全的,所以越来越多的网站开始使 用http的加密版----https协议
-
**主机(host)**是资源所在网站名或服务器的名字,又称为域名。
上述
www.ccc.net
就是主机,有些主机没有域名只有ip地址,在这里还涉及到DNS域名解析器的工作原理,上述内容已经写了较为详细的过程了。 -
端口:同一个域名下可能包含多个网站,他们之间通过端口(port)区分。可以理解为,访问者告诉服务器想要访问哪一个端口。HTTP协议的默认端口是80,如果省略了这个参数,服务器就会返回80端口的网站。
-
**路径(path)**是资源在网站的位置。上述
/index
表示的就是路径。早期的路径指的是真实的物理地址,现在服务器可以模拟这些地址,所以现在的路径指的是虚拟地址。路径可以只包含目录,不包含文件名。 -
**查询参数(parameter)**是提供给服务器的额外信息。查询参数可以有一组或者多组。没对参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用=链接。
-
锚点(anchor)是网页内部的定位点,使用
#
加上锚点名称,放在网址的最后,比如#anchor
。浏览器加载页面以后,会自动滚动到锚点所在的位置。
-
-
保留字符:URL中规定了一些具有特殊意义的字符,常被用来分割两个不同的URL组件,这些字符被称为保留字符。
- **😗*用于分割协议和主机组件;
- **/**用于分割主机和路径;
- **?**用于分割路径和查询参数等;
- **=**用于表示查询参数中的键值对;
- **&**用于分隔查询多个键值对
- 其余保留字符**. … # @ $ + ; %**
-
字符转义:URL的字符转义方法是在这些字符的十六进制ASCII码钱加(
%
)!
:21%#
:23%$
:24%&
:26%'
:27%(
:%28)
:%29*
:%2A+
:%2B,
:%2C/
:%2F:
:%3A;
:%3B=
:%3D?
:%3F@
:%40[
:%5B]
:%5D
URL分为绝对URL和相对URL两种
- 绝对URL:只靠URL本身就能确定组员的位置。这意味着,URL必须带有资源的完整信息,包含协议、主机、路径等部分。
- 相对URL:URL不包含资源位置的全部信息,必须结合当前网页的位置,才能定位资源。(可以参照文件目录的相对路径)
URL还有两种特殊的简写方式:
.
:表示当前目录,比如./a.html
,表示当前目录下的a.html
文件..
:表示上级目录,比如../a.html
(上级目录下的a.html
文件)- 引申用法:
../../
表示上两级目录
正则表达式
正则表达式测试网站:https://regexr-cn.com/
练习网站:https://codejiaonang.com/
基础
- []:表示匹配括号内的内容
- [abc]:表示匹配含a,b,c的字符
- [a-z]:区间匹配,表示匹配含小写字母a到z的所有字符
- 特殊字符匹配:如匹配
[]
,则需要在[]前加上\
转义符[\[]]
- [^0-9]:匹配非数字0-9的字符
- 快捷匹配
- \d:匹配所有的数字
- \w:匹配所有的字母
- \s:匹配空白,如tab,空格,换行之类的空白字符
- \b:匹配单词的边界,如
\bbody\b
则表示匹配body单词,不受其前后字符的影响。
- 快捷匹配取反
- \D:匹配所有的非数字字符
- \W:匹配所有的非字母字符
- \S:匹配所有非空白字符
- \B:匹配非单词边界
- ^:用在匹配对象的前面,表示匹配开头,如
^python
表示匹配以python开头的数据 - ** ∗ ∗ :用在匹配对象的后面,表示匹配结尾,如 ‘ p y t h o n **:用在匹配对象的后面,表示匹配结尾,如`python ∗∗:用在匹配对象的后面,表示匹配结尾,如‘python`表示匹配以python结尾的数据
- .:匹配任意字符,换行符
\n
除外 - ?:匹配可选字符,可以出现0次或者多次,如
yours?
,则可以匹配your、yours等 - {}:匹配重复
- \d{9}:匹配出现了9次数字的字符串
- \d{7,9}:区间匹配,表示匹配数字出现了7到9次的数字
- \d{7,9}?:加一个?表示非贪婪模式正则匹配,当匹配到7个数字之后就不再继续向后匹配,如
12346789
的匹配结果为1234567
- \d{7,}:匹配7位或7位以上的数字
- +:等于
{1,}
- *****:等于
{0,}
进阶
分组
在正则表达式中提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配,还能够在匹配中选择每一个分组。
用法:用()
将条件括起来就可以了,如匹配电话号码0731-8881231的正则表达式为(\d{4})-(\d{7})
-
或者条件:使用分组的同时还可以使用或者
(or)
条件。如(.jpg|.png|.gif)
表示提取含.jpg或者.png或者.gif的内容 -
非捕获分组:有时候我们并不需要某个分组的内容,但是又想使用分组的特性。这个时候就可以使用非捕获分组
(?:表达式)
,从而不捕获数据,还能使用分组的功能。如从以下数据中提取电话号码的正则表达式为
(?:\d{2}|\d{3}|tel)[\-:](\d{11})
01-13615874615 012-15896354876 tel:15964852164 -
分组的回溯引用:正则表达式中海提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个匹配,该匹配接下来会再次出现。
如我们需要匹配font标签中的"提示"字段
<font>提示</font>
正则表达式可以写为
<\w+>(.*?)</\w+>
但是如果这样匹配的话如果出现以下字段也能匹配成功,但是此时的font标签已经错了。这种情况我们就可以用到回溯引用了
<font>提示</body>
写法:
<(\w+)>(.*?)</\1>
其中1
表示第一个分组内的内容,也就是\w+
,表示的意思时内容要第一个分组内的一致,如此一来,就可以确定所匹配的内容时正确的font标签内的内容了。
断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索。
断言一共有四种:
-
正向先行断言:
(?=表达式)
,指在某个位置向右看,表示所在位置右侧必须能匹配表达式
例如:
我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要写:
喜欢(?=你)
,这就是正向先行断言。 -
反向先行断言:
?!表达式
,作用是保证不能出现某字符。例如:
我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:
喜欢?!你
,这就是反向先行断言。 -
正向后行断言:
?<=表达式
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:
我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你
取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要写
(?<=我)喜欢(?=你)。
-
反向后行断言:
?<!表达式
指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:
我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你
取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就写
(?<!我)喜欢(?!你)