将css代码压缩能够减小文件的体积,从而减小了网络传输量和带宽占用,减小了服务器的处理的压力
源码:
代码如下 | 复制代码 |
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <?php $string = trim(stripslashes($_POST['code'])); //stripslashes()函数删除转义字符(反斜杠) if(!empty($string)){ if($_POST['method'] == '压缩' ){ $string = css_compress($string); }elseif($_POST['method'] == '解压缩' ){ $string = css_decompress($string); } }else{ $string = ''; } function css_compress($string){ //压缩 $string = str_replace("\r\n","",$string); //首先去掉换行 $string = preg_replace("/(\s*\{\s*)/","{",$string); $string = preg_replace("/(\s*\;\s*\}\s*)/","}",$string); //去掉反括号首位的空格和换行,和最后一个; $string = preg_replace("/(\s*\;\s*)/",";",$string); return $string; } function css_decompress($string){ //解压 $string = css_compress($string); //为了效果更好,解压前,先压缩至最简状态 $string = str_replace("{","\r\n{\r\n\t",$string); $string = str_replace("}","\r\n}\r\n\r\n",$string); $string = str_replace(";",";\r\n\t",$string); $string = str_replace("*/","*/\r\n",$string); return $string; } ?> <body> <div style="width:800px;height:500px;text-align:center"> <p><strong>请将css代码粘贴到下面框中,然后选择压缩/解压缩</strong></p> <form action="" method="post" name="css_code"> <textarea style="width:90%;height:460px;padding:5px;" name="code"><?php echo $string; ?></textarea> <br /> <input type="submit" name="method" value="压缩" /> <input type="submit" name="method" value="解压缩" /> </form> </div> </body> </html> |
函数
代码如下 | 复制代码 |
function hidtel($phone){ 示例: $phonenum = "13966778888"; |
例子
1、屏蔽手机号码中间段:
代码如下 | 复制代码 |
preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone); |
2、屏蔽固定电话中间段:
代码如下 | 复制代码 |
preg_replace('/(0[0-9]{2,3}[-]?[2-9])[0-9]{3,4}([0-9]{3}[-]?[0-9]?)/i','$1****$2',$phone); |
例如:
代码如下 | 复制代码 |
$phone = '010-88888888-8'; $phone = preg_replace('/(0[0-9]{2,3}[-]?[2-9])[0-9]{3,4}([0-9]{3}[-]?[0-9]?)/i','$1****$2',$phone); echo $phone,'<br>www.111Cn.net'; 结果输出: 138****8888 |
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,格式如下:
可见请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。
HTTP请求方法:
GET: 请求指定的页面信息,并返回实体主体。
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE: 请求服务器删除指定的页面。
OPTIONS: 允许客户端查看服务器的性能。
TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
MOVE: 请求服务器将指定的页面移至另一个网络地址。
COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
LINK: 请求服务器建立链接关系。
UNLINK: 断开链接关系。
WRAPPED: 允许客户端发送经过封装的请求。
Extension-mothed:在不改动协议的前提下,可增加另外的方法。
HTTP响应状态码:
① 客户方错误
100 继续
101 交换协议
② 成功
200 OK
201 已创建
202 接收
203 非认证信息
204 无内容
205 重置内容
206 部分内容
③ 重定向
300 多路选择
301 永久转移
302 暂时转移
303 参见其它
304 未修改(Not Modified)
305 使用代理
④ 客户方错误
400 错误请求(Bad Request)
401 未认证
402 需要付费
403 禁止(Forbidden)
404 未找到(Not Found)
405 方法不允许
406 不接受
407 需要代理认证
408 请求超时
409 冲突
410 失败
411 需要长度
412 条件失败
413 请求实体太大
414 请求URI太长
415 不支持媒体类型
⑤ 服务器错误
500 服务器内部错误
501 未实现(Not Implemented)
502 网关失败
504 网关超时
505 HTTP版本不支持
先我想说,百度上那些转来转去的文章都是扯淡!
有说相同的,有说不同的,都没说明原因,没经过验证就互相转来转去的,浪费观众时间。
下面说说本人经过亲自验证 + 查阅官方文档 + 官方BUG列表 + 官方邮件列表 + sitepoint + webmasterworld + google的总结:
相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范
不同点:
1. 通常情况:
_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。
2. 当服务器为非80端口时:
_SERVER["HTTP_HOST"] 会输出端口号,例如:111cn.net:8080
_SERVER["SERVER_NAME"] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT
3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:
httpd.conf配置如下:
代码如下 | 复制代码 |
<virtualhost *> |
所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。
星际的兵种属性随着对平衡性的调节,会进行修改。如果这样的话,我们就要考虑减少一个事件和具体处理的关联性。
比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的。
待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理。
思路:建立一个接口,让所有的部队或者建筑实现。
职责链模式(Chain of Responsibility)示例:
代码如下 | 复制代码 |
<?php //被原子弹攻击的接口 interface NuclearAttacked { //处理被原子弹攻击的方法,参数为投放点的x和y坐标 public function NuclearAttacked($x, $y); } //人族的基地,实现被原子弹攻击的接口,其他的内容暂时不考虑 class CommandCenter implements NuclearAttacked { //处理被原子弹攻击的方法,参数为投放点的x和y坐标 public function NuclearAttacked($x, $y) { //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉 } } //巡洋舰(俗称大和),实现被原子弹攻击的接口,其他的内容暂时不考虑 class Battlecruiser implements NuclearAttacked { //处理被原子弹攻击的方法,参数为投放点的x和y坐标 public function NuclearAttacked($x, $y) { //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉 } } //原子弹类 class Nuclear { //被原子弹攻击的对象 public $attackedThings; //添加被原子弹攻击的对象 public function addAttackedThings($thing) { //添加被原子弹攻击的对象 $this->attackedThings[] = $thing; } //原子弹爆炸的方法,参数为投放点的x和y坐标 public function blast($x, $y) { //把爆炸的事情交给所有涉及的对象,让他们自己处理 foreach ($this->attackedThings as $thing) { //把爆炸的事情交给所有涉及的对象,让他们自己处理 $thing->NuclearAttacked($x, $y); } } } //新建一个基地对象 $CommandCenter = new CommandCenter(); //新建一个巡洋舰对象 $Battlecruiser = new Battlecruiser(); //造了一颗原子弹 $Nuclear2 = new Nuclear(); //假设投放成功,那个瞬间一个基地对象和一个巡洋舰对象在杀伤范围内 $Nuclear2->addAttackedThings($CommandCenter); $Nuclear2->addAttackedThings($Battlecruiser); //原子弹爆炸,这样就把这个事件交给那些涉及的对象的处理方法,假设投放点的x和y坐标是2353, 368 $Nuclear2->blast(2353, 368); ?> |
用途总结:职责链模式可以将一个涉及到多个对象的事件的处理交给对象自己处理,减少关联性。