HTML实体编码、URL编码、正则表达式、状态码总结

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字符编码,格式: 以符号&#开头,分号;结尾

例:

 &lt;p style=&quot;color: red;&quot; &gt;&#104;&#101;&#108;&#108;&#111;&#0033; &lt;/p &gt;

在浏览器中打印的结果:

<p style="color: red;" >hello! </p >

**注:**HTML实体编码不能用于JavaScript

状态码

HTTP[状态码](HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。

状态码类别原因
1xxInformational(信息性状态码)接受的请求正在处理
2xxSuccess(成功状态码)请求正常处理完毕
3xxRedirection(重定向状态码)需要进行附加操作已完成请求
4xxClient Error(客户端错误状态码)客户端无法处理请求
5xxServer 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网关超时服务器作为网关或代理,但是没有及时从上游服务器收到请求
505HTTP 版本不受支持服务器不支持请求中所用的 HTTP 协议版本

重点

方法缓存(永久重定向)不缓存(临时重定向)
转GET301302、303
方法保持308307

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标签内的内容了。

断言

​ 很多人也称先行断言和后行断言为环视,也有人叫预搜索。

​ 断言一共有四种:

  • 正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式

    例如:我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你

    如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要写:喜欢(?=你),这就是正向先行断言。

  • 反向先行断言:?!表达式,作用是保证不能出现某字符。

    例如:我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你

    如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢?!你,这就是反向先行断言。

  • 正向后行断言:?<=表达式,指在某个位置向左看,表示所在位置左侧必须能匹配表达式

    例如:我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你

    取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要写(?<=我)喜欢(?=你)。

  • 反向后行断言:?<!表达式指在某个位置向左看,表示所在位置左侧不能匹配表达式

    例如:我喜欢你 我喜欢 我喜欢她 喜欢 喜欢你

    取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就写(?<!我)喜欢(?!你)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值