首页
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
2,297 阅读
2
【Layui】控制页面元素展示隐藏
2,113 阅读
3
【Git】No tracked branch configured for branch master or the branch doesn't exist.
2,028 阅读
4
【PHP】PHP实现JWT生成和验证
2,015 阅读
5
【composer】composer常用命令
1,820 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
swoole
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
JavaScript
OOP
Layui
Web
Server
Nginx
Docker
PHPSpreadsheet
PHPoffice
Array
设计模式
Git
排序算法
基础
小破孩
累计撰写
268
篇文章
累计收到
13
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
swoole
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
页面
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
搜索到
264
篇与
的结果
2022-06-21
【JavaScript】JavaScript基础-浏览器对象
弹出框 alert(1); var ret = prompt("请输入内容!",""); var v = confirm('此操作不可恢复,确认吗?'); 返回true可操作 window.close();关闭当前窗口 window.print();打印 计时器 function fn() { var d=new Date(); var t=d.toLocaleTimeString(); document.getElementById("a1").innerHTML=t; } var t = setTimeout("fn()",5000); 执行一次 clearTimeout(t); 提前结束 var id=setInterval("fn()",1000);//每1秒执行一次 clearInterval(id); 取消定时 读写localStorage,长时间存储 sessionStorage关闭后删除 localStorage.setItem("key1", "123"); localStorage.removeItem("bar"); var foo = localStorage.getItem("bar"); 选择器 var id=document.getElementById("id"); var id = document.querySelector("#k"); 支持标签,.class,a[target=_blank]属性 var id = document.querySelectorAll("li"); window document.write("123") 输出 console.log("控制台") var url = location.href; location.href='http://www.baidu.com'; var domain = document.domain;//不含http var url = (window.location.href).substring(0,(window.location.href).indexOf(document.location.pathname));//包含http var from = document.referrer;来源 location.reload(true);刷新 history.go(0); history.go(1);前进 history.go(-1);后退 document.title; document.title = "标题"; document.querySelector('#c').dataset.sex = "男";data属性 document.querySelector('#c').dataset.sex; document.getElementById('demo1').setAttribute('role', 'button'); 设置获取属性 document.getElementById('foo').removeAttribute('role'); document.getElementById('foo').innerHTML = 'Goodbye!';设置值 逻辑 if (time<10) { document.write("<b>早上好</b>"); } else if (time>=10 && time<16) { document.write("<b>今天好</b>"); } else { document.write("<b>晚上好!</b>"); } switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: 与 case 1 和 case 2 不同时执行的代码 } for (var i=0;i<cars.length;i++) { document.write(cars[i] + "<br>"); } while (条件) { 需要执行的代码 } 监听事件 var el= document.querySelector('#btn'); el.addEventListener('click',function(){ document.getElementById('loading1').classList.add('loading1'); })
2022年06月21日
356 阅读
0 评论
0 点赞
2022-06-21
【PHP】ThinkPHP6 基本操作
请求变量 use think\facade\Request; Request::param('name'); Request::param();全部请求变量 返回数组 Request::param(['name', 'email']); 多个变量 Request::param('a','1') $a不存在使用默认值1 Request::param('username','','strip_tags'); 参数过滤 去掉html标签 htmlspecialchars转换成实体入库 strtolower小写 Request::header(); 请求头数组,支持单个 cookie input("name"); Request::session();获取 $_SESSION 变量 Request::cookie();获取 $_COOKIE 变量 Request::server();获取 $_SERVER 变量 Request::env();返回env数组 Request::file();获取 $_FILES 变量 Request::baseUrl(); /index/index Request::host(true); 域名:www.baidu.com,默认无参数包含端口:80 Request::url(1); 完整域名和地址 http://tp6.api.shanliwawa.top:80/index/index Request::domain(1) http://tp6.api.shanliwawa.top Request::time() 请求时间戳 Request::app() 应用名 index Request::controller() 控制器 Index 参数true小写 Request::action() 操作 index 参数true 小写 Request::method(true); 请求类型获取 GET isGet isPost isPut isDelete isAjax isMobile isHead 判断是否某种类型 Request::has('id','get'); 检测变量id是否存在 url('index/hello', ['id'=>5,'name'=>'李白'],'do'); http://tp6.api.shanliwawa.top/index/hello/李白.do?id=5 url('index/hello#aa'); 锚点 Cache::set('name', $value, 3600); 1小时后过期 Cache::get('name'); 获取缓存 多缓存类型配置 return [ // 缓存类型为File 'type' => 'redis', // 全局缓存有效期(0为永久有效) ,开发下一定要设置-1 否在刷新后 还在 'expire'=> -1, // 缓存前缀 'prefix'=> 'think', // 缓存目录 'host' => '127.0.0.1', ]; return [ // 使用复合缓存类型 'type' => 'complex', // 默认使用的缓存 'default' => [ // 驱动方式 'type' => 'file', // 缓存保存目录 'path' => '../runtime/default', ], // 文件缓存 'file' => [ // 驱动方式 'type' => 'file', // 设置不同的缓存保存目录 'path' => '../runtime/file/', ], // redis缓存 'redis' => [ // 驱动方式 'type' => 'redis', // 服务器地址 'host' => '127.0.0.1', ], ]; use think\facade\Cache; Cache::store('file')->set('name','123',0); $v = Cache::store('redis')->get('name'); Cache::store('default')->get('name');文件缓存 Cache::delete('name'); Cache::clear(); Cache::set('name', [1,2,3]); Cache::push('name', 4); Cache::remember('start_time', time()); 不存在则创建 Cache::inc('name',1); 自增1 Cache::dec('name',1); 自减1 $redis = Cache::handler(); redis对象 配置redis session return [ 'type' => 'redis', 'prefix' => 'think', 'auto_start' => true, // redis主机 'host' => '127.0.0.1', // redis端口 'port' => 6379, // 密码 'password' => '', ] session('name', ['thinkphp']); 设置支持字符串 数组 session('name');获取 session('name', null);删除 session(null);清空 cookie('name', 'value', 3600); 设置不支持数组,序列化后存储 cookie('name'); cookie('name', null); cookie('think_lang','en-us');//设置语言类型 lang('add user error');//翻译 config('cache.type') 读取配置 验证 {:token_field()} 模板中输出令牌 {:token_meta()} ajax提交 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); Route::post('blog/save','blog/save')->token(); 路由中使用验证 think\facade\Validate $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 10, 'email' => 'thinkphp@qq.com', ]; $validate = Validate::rule($rule)->message($msg); $result = $validate->check($data); if(!$result) { dump($validate->getError()); } 路由 Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则 ->allowCrossDomain();跨域 输出响应 $data=['code'=>200,'msg'=>'信息提示','list'=>['中国']]; json($data); jsonp($data); xml($data); redirect('http://www.thinkphp.cn'); redirect('/index/hello/name'); //站内跳转 download('./static/2.xlsx'); 下载 数据库 use think\facade\Db; $rs =Db::name('user')->where('id',1)->find(); 查询一条记录 name不含前缀 $rs =Db::table('ims_user')->where('sex', 2)->select(); 多条数据 table含前缀 $rs1 =Db::name('user')->where('id', 1)->value('name'); 查询某个字段值 $rs =Db::table('ims_user')->where('sex', 2)->column('name,id','id'); 返回name,id列,后面是key $userId = Db::name('user')->insertGetId($data);//插入数据返回id Db::name('user') ->limit(100) ->insertAll($data); 插入多条数据,分每次100 Db::name('user') ->where('id', 1) ->update(['name' => 'thinkphp']); 更新 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); Db::table('think_user')->where('id',1)->delete(); Db::name('user')->delete(true);//清空数据 where('id','<>',1) 不等于1 > >= like where("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp']) field('id,title,content') 指定字段 limit(10,25) 第十条开始25条 单数字返回数据条数 page(1,10) 第一页十条 order(['id'=>'desc','sex'=>'desc']) 排序 group('user_id,test_time') 分组 count() max('id') min() avg() sum() 聚合函数 whereTime('birthday', '>=', '1970-10-1') 支持< = whereTime('create_time','-2 hours') 查询2小时 whereBetweenTime('create_time', '2017-01-01', '2017-06-30') 查询时间段 whereYear('create_time') 今年 whereYear('create_time','2018') last year 去年 whereMonth('create_time') last month上月 2018-06 具体月份 whereWeek('create_time') last week 上周 whereDay('create_time')今天 yesterday昨天 2018-11-1具体 Db::query("select * from think_user where status=1"); 原生查询 Db::execute("update think_user set name='thinkphp' where status=1");//更新插入删除 Db::query("select * from think_user where id=? AND status=?", [8, 1]);//绑定 $list = Db::name('user')->where('status',1)->paginate(10); 分页每页10条 模型 定义全局常量 define('__URL__',\think\facade\Request::domain(1)); http://tp6.api.shanliwawa.top define('__ROOT__',\think\facade\app::getRootPath()); 系统根目录 C:\www\tp6\ define("PRE",config('database.prefix')); 表前缀 绝对路径获取 \think\facade\app::getRootPath() 根目录C:\www\tp6\ \think\facade\app::getAppPath() 应用路径 C:\www\tp6\app\index\ \think\facade\app::getConfigPath() 配置路径C:\www\tp6\config\ \think\facade\app::version() 核心版本 模板视图 use think\facade\View; View::assign([ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::assign('data',[ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::fetch('index'); 助手函数 view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); 模板输出 {$name} {$data.name} 等价 {$data['name']} {:dump($data)} 使用函数 :开头 {$user.nickname|default="这家伙很懒,什么也没留下"} {$Think.cookie.name} // 输出$_COOKIE['name']变量 {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量 {$Think.session.user_id} // 输出$_SESSION['user_id']变量 {$Think.get.page} // 输出$_GET['page']变量 {$Request.param.name} 获取name {$data.name|raw} 不转义输出 {$data.create_time|date='Y-m-d H:i'} {literal} Hello,{$name}! 原样输出 {/literal} {load href="/static/js/common.js,/static/js/common.css" /} 加载js,css {php}echo 'Hello,world!';{/php} {/* 注释内容 */ } 或 {// 注释内容 } {include file="public/header" /} 模板包含 {include file="Public/header" title="$title" keywords="开源WEB开发框架" /} 传入参数 {foreach $list as $key=>$vo } {$vo.id}:{$vo.name} {/foreach} {for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" } {/for} {if 表达式}value1 {elseif 表达式 /}value2 {else /}value3 {/if} 记录日志 log.php 可添加 'json' => 1 表示json格式 trace("日志信息") app.php中 'app_trace' => true, trace.php改为默认html 'type' => 'Console', 上传 $file = request()->file('image'); 移动到框架应用根目录/uploads/ 目录下 $info = $file->move( '../uploads'); if($info){ 成功上传后 获取上传信息 输出 jpg echo $info->getExtension(); 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg echo $info->getSaveName(); 输出 42a79759f284b767dfcb2a0197904287.jpg echo $info->getFilename(); }else{ 上传失败获取错误信息 echo $file->getError(); } 多文件xphr foreach($files as $file){} 验证,生成带md5文件名 $info = $file->rule('md5')->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move( '../uploads');
2022年06月21日
362 阅读
0 评论
0 点赞
2022-06-21
【Vue】Vue基础语法
简单例子 <div id="app"> {{ message }} </div> <script> var app = new Vue({ el: '#app', data: { message: '测试vue!' } }) </script> <div id="app"> <ul><li v-for="rs in todos"> {{rs.text}}</li></ul> </div> var app = new Vue({ el: '#app', data: { todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] } }) 模板语法 一次插值,后面不会改变 v-once 输出原始值 <span v-html:style="msg">你好</span> 输出属性 <span v-bind:style="msg">你好</span> if语句 <span v-if="msg">true看见我</span> <h1 v-if="msg=='ok'">是</h1> <h1 v-else-if="msg=='ok1'">是1</h1> <h1 v-else>否</h1> 管理重复数据 key="username-input" 监听事件 <a v-on:click="alert(1)">123</a> v-bind缩写 : v-on 缩写@ 数组方式调用class <div v-bind:class="[activeClass, errorClass]"></div> 绑定内联样式 <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div> 显示隐藏 <h1 v-show="msg=='ok'">是</h1> 不支持<template>和else,是display显示隐藏 列表渲染 <li v-for="item in items"> {{ item.message }} </li> 带索引 <li v-for="(item, index) in items"> {{ parentMessage }} - {{ index }} - {{ item.message }} </li> 对象也支持三个参数 <div v-for="(value, key, index) in object"> {{ index }}. {{ key }}: {{ value }} </div> 唯一性 <div v-for="item in items" :key="item.id"> <!-- 内容 --> </div> 方法 <button v-on:click="fn">创建</button> var app = new Vue({ el: '#app', data: {msg:'ok1' } ,methods:{ 'fn':function(event){ alert("q"+this.msg) } } }) 事件修饰符 <!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修饰符 --> <form v-on:submit.prevent></form> <!-- 添加事件监听器时使用事件捕获模式 --> <!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 --> <div v-on:click.capture="doThis">...</div> <!-- 只当在 event.target 是当前元素自身时触发处理函数 --> <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div> <!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a> <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 --> <!-- 而不会等待 `onScroll` 完成 --> <!-- 这其中包含 `event.preventDefault()` 的情况 --> <div v-on:scroll.passive="onScroll">...</div> <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` --> <input v-on:keyup.13="submit"> .enter .tab .delete (捕获“删除”和“退格”键) .esc .space .up .down .left .right 表单 <input v-model="message" placeholder="edit me"> <input type="checkbox" id="checkbox" v-model="checked"> <!-- 在“change”时而非“input”时更新 --> <input v-model.lazy="msg" > <input v-model.number="age" type="number"> <input v-model.trim="msg">
2022年06月21日
307 阅读
0 评论
0 点赞
2022-06-21
【MySQL】MySQL添加用户、删除用户与授权及基本操作
> MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): **1.新建用户** 1.1 登录MYSQL: @>mysql -u root -p @>密码 1.2 创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 这样就创建了一个名为:test 密码为:1234 的用户。 > 注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。 1.3 然后登录一下: mysql>exit; @>mysql -u test -p @>输入密码 mysql>登录成功 **2.为用户授权** > 授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录: @>mysql -u root -p @>密码 2.2 首先为用户创建一个数据库(testDB): mysql>create database testDB; 2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限): mysql>grant all privileges on testDB.* to test@localhost identified by '1234'; mysql>flush privileges;//刷新系统权限表 > 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.4 如果想指定部分权限给一用户,可以这样来写: mysql>grant select,update on testDB.* to test@localhost identified by '1234'; mysql>flush privileges; //刷新系统权限表 2.5 授权test用户拥有所有数据库的某些权限: mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234"; > //test用户对所有数据库都有select,delete,update,create,drop 权限。 > //@"%"表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。) > //对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。 **3. 删除用户** @>mysql -u root -p @>密码 mysql>Delete FROM user Where User='test' and Host='localhost'; mysql>flush privileges; mysql>drop database testDB; //删除用户的数据库 删除账户及权限:>drop user 用户名@'%'; >drop user 用户名@ localhost; **4. 修改指定用户密码** @>mysql -u root -p @>密码 mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost"; mysql>flush privileges; **5. 列出所有数据库** mysql>show database; **6. 切换数据库** mysql>use '数据库名'; **7. 列出所有表** mysql>show tables; **8. 显示数据表结构** mysql>describe 表名; **9. 删除数据库和数据表** mysql>drop database 数据库名; mysql>drop table 数据表名;
2022年06月21日
339 阅读
0 评论
0 点赞
2022-06-21
【PHP】ThinkPHP5 实现sentry通知,记录日志
<?php namespace app\index\common; use think\Log; class Logs { //sentry日志收集器 static public function sentryLogs($e,$line,array $data = []) { Log::init([ 'type' => 'File', 'path' => LOG_PATH, ]); $sentryClient = new \Raven_Client( 'https://c5485e6c233347ca8a7990a2bf77514a:9a69f3eb68c446f8ae3247eb368c1ff6@sentry.io/1193480', [ 'name' => \Raven_Compat::gethostname(),//服务器主机名 'environment' => 'production', 'level' => 'error', //附加数据 'extra' => $data, 'app_path' => ROOT_PATH, 'sample_rate' => 1,//值0.00将拒绝发送任何事件,值1.00将发送100%的事件。 'curl_method' => 'async',//curl异步发送,比同步体验好很多 //回掉方法,在发送数据之前操作 'send_callback' => function ($data) { }, ]); //单独设置用户信息 $sentryClient->user_context([ 'id' => 2966, 'username' => 'XPH', 'email' => '3584685883@qq.com', 'mobile' => '176****376', 'ip_address' => $_SERVER['REMOTE_ADDR'] ]); if ( $e && is_object($e) ) { $sentryClient->captureException($e); $errorMsg = "\n文件:".$e->getFile()."\n行数:".$e->getLine()."\n错误代码:".$e->getCode()."\n错误信息:".$e->getMessage()."\n"; }else{ //当没有异常只想记录信息的时候可以使用这个 $sentryClient->captureMessage($e); $errorMsg = $e."\n行数:".$line; } Log::record($errorMsg); } }
2022年06月21日
371 阅读
0 评论
0 点赞
2022-06-21
【Redis】PHP操作Redis
> 使用扩展predis(redis命令文档:爱好者翻译文档,redis中文网文档) > composer require predis/predis //配置连接的IP、端口、以及相应的数据库 $server = array ( 'host' => '127.0.0.1' , 'port' => 6379 , 'database' => 15 ) ; $redis = new Client ( $server ) ; //普通set/get操作 $redis -> set ( 'library' , 'predis' ) ; $retval = $redis -> get ( 'library' ) ; echo $retval ; //显示 'predis' //setex set一个存储时效 $redis -> setex ( 'str' , 10 , 'bar' ) ; //表示存储有效期为10秒 //setnx/msetnx相当于add操作,不会覆盖已有值 $redis -> setnx ( 'foo' , 12 ) ; //true $redis -> setnx ( 'foo' , 34 ) ; //false //getset操作,set的变种,结果返回替换前的值 $redis -> getset ( 'foo' , 56 ) ; //返回34 // incrby/incr/decrby/decr 对值的递增和递减 $redis -> incr ( 'foo' ) ; //foo为57 $redis -> incrby ( 'foo' , 2 ) ; //foo为59 //exists检测是否存在某值 $redis -> exists ( 'foo' ) ; //true //del 删除 $redis -> del ( 'foo' ) ; //true //type 类型检测,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash $redis -> type ( 'foo' ) ; //不存在,返回none $redis -> set ( 'str' , 'test' ) ; $redis -> type ( 'str' ) ; //字符串,返回string //append 连接到已存在字符串 $redis -> append ( 'str' , '_123' ) ; //返回累加后的字符串长度8,此进str为 'test_123' //setrange 部分替换操作 $redis -> setrange ( 'str' , 0 , 'abc' ) ; //返回3,参数2为0时等同于set操作 $redis -> setrange ( 'str' , 2 , 'cd' ) ; //返回4,表示从第2个字符后替换,这时'str'为'abcd' //substr 部分获取操作 $redis -> substr ( 'str' , 0 , 2 ) ; //表示从第0个起,取到第2个字符,共3个,返回'abc' //strlen 获取字符串长度 $redis -> strlen ( 'str' ) ; //返回4 //setbit/getbit 位存储和获取 $redis -> setbit ( 'binary' , 31 , 1 ) ; //表示在第31位存入1,这边可能会有大小端问题?不过没关系,getbit 应该不会有问题 $redis -> getbit ( 'binary' , 31 ) ; //返回1 //keys 模糊查找功能,支持*号以及?号(匹配一个字符) $redis -> set ( 'foo1' , 123 ) ; $redis -> set ( 'foo2' , 456 ) ; $redis -> keys ( 'foo*' ) ; //返回foo1和foo2的array $redis -> keys ( 'f?o?' ) ; //同上 //randomkey 随机返回一个key $redis -> randomkey ( ) ; //可能是返回 'foo1'或者是'foo2'及其它任何一存在redis的key //rename/renamenx 对key进行改名,所不同的是renamenx不允许改成已存在的key $redis -> rename ( 'str' , 'str2' ) ; //把原先命名为'str'的key改成了'str2' //expire 设置key-value的时效性,ttl 获取剩余有效期,persist 重新设置为永久存储 $redis -> expire ( 'foo' , 1 ) ; //设置有效期为1秒 $redis -> ttl ( 'foo' ) ; //返回有效期值1s $redis -> expire ( 'foo' ) ; //取消expire行为 //dbsize 返回redis当前数据库的记录总数 $redis -> dbsize ( ) ; /* * 队列操作 */ //rpush/rpushx 有序列表操作,从队列后插入元素 //lpush/lpushx 和rpush/rpushx的区别是插入到队列的头部,同上,'x'含义是只对已存在的key进行操作 $redis -> rpush ( 'fooList' , 'bar1' ) ; //返回一个列表的长度1 $redis -> lpush ( 'fooList' , 'bar0' ) ; //返回一个列表的长度2 $redis -> rpushx ( 'fooList' , 'bar2' ) ; //返回3,rpushx只对已存在的队列做添加,否则返回0 //llen返回当前列表长度 $redis -> llen ( 'fooList' ) ; //3 //lrange 返回队列中一个区间的元素 $redis -> lrange ( 'fooList' , 0 , 1 ) ; //返回数组包含第0个至第1个共2个元素 $redis -> lrange ( 'fooList' , 0 ,- 1 ) ; //返回第0个至倒数第一个,相当于返回所有元素,注意redis中很多时候会用到负数,下同 //lindex 返回指定顺序位置的list元素 $redis -> lindex ( 'fooList' , 1 ) ; //返回'bar1' //lset 修改队列中指定位置的value $redis -> lset ( 'fooList' , 1 , '123' ) ; //修改位置1的元素,返回true //lrem 删除队列中左起指定数量的字符 $redis -> lrem ( 'fooList' , 1 , '_' ) ; //删除队列中左起(右起使用-1)1个字符'_'(若有) //lpop/rpop 类似栈结构地弹出(并删除)最左或最右的一个元素 $redis -> lpop ( 'fooList' ) ; //'bar0' $redis -> rpop ( 'fooList' ) ; //'bar2' //ltrim 队列修改,保留左边起若干元素,其余删除 $redis -> ltrim ( 'fooList' , 0 , 1 ) ; //保留左边起第0个至第1个元素 //rpoplpush 从一个队列中pop出元素并push到另一个队列 $redis -> rpush ( 'list1' , 'ab0' ) ; $redis -> rpush ( 'list1' , 'ab1' ) ; $redis -> rpush ( 'list2' , 'ab2' ) ; $redis -> rpush ( 'list2' , 'ab3' ) ; $redis -> rpoplpush ( 'list1' , 'list2' ) ; //结果list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3') $redis -> rpoplpush ( 'list2' , 'list2' ) ; //也适用于同一个队列,把最后一个元素移到头部list2 =>array('ab3','ab1','ab2') //linsert 在队列的中间指定元素前或后插入元素 $redis -> linsert ( 'list2' , 'before' , 'ab1' , '123' ) ; //表示在元素'ab1'之前插入'123' $redis -> linsert ( 'list2' , 'after' , 'ab1' , '456' ) ; //表示在元素'ab1'之后插入'456' //blpop/brpop 阻塞并等待一个列队不为空时,再pop出最左或最右的一个元素(这个功能在php以外可以说非常好用) //brpoplpush 同样是阻塞并等待操作,结果同rpoplpush一样 $redis -> blpop ( 'list3' , 10 ) ; //如果list3为空则一直等待,直到不为空时将第一元素弹出,10秒后超时 /** set表操作 */ //sadd 增加元素,返回true,重复返回false $redis -> sadd ( 'set1' , 'ab' ) ; $redis -> sadd ( 'set1' , 'cd' ) ; $redis -> sadd ( 'set1' , 'ef' ) ; //srem 移除指定元素 $redis -> srem ( 'set1' , 'cd' ) ; //删除'cd'元素 //spop 弹出首元素 $redis -> spop ( 'set1' ) ; //smove 移动当前set表的指定元素到另一个set表 $redis -> sadd ( 'set2' , '123' ) ; $redis -> smove ( 'set1' , 'set2' , 'ab' ) ; //移动'set1'中的'ab'到'set2',返回true or false //scard 返回当前set表元素个数 $redis -> scard ( 'set2' ) ; //2 //sismember 判断元素是否属于当前表 $redis -> sismember ( 'set2' , '123' ) ; //true or false //smembers 返回当前表的所有元素 $redis -> smembers ( 'set2' ) ; //array('123','ab'); //sinter/sunion/sdiff 返回两个表中元素的交集/并集/补集 $redis -> sadd ( 'set1' , 'ab' ) ; $redis -> sinter ( 'set2' , 'set1' ) ; //返回array('ab') //sinterstore/sunionstore/sdiffstore 将两个表交集/并集/补集元素copy到第三个表中 $redis -> set ( 'foo' , 0 ) ; $redis -> sinterstore ( 'foo' , 'set1' ) ; //这边等同于将'set1'的内容copy到'foo'中,并将'foo'转为set表 $redis -> sinterstore ( 'foo' , array ( 'set1' , 'set2' ) ) ; //将'set1'和'set2'中相同的元素copy到'foo'表中,覆盖'foo'原有内容 //srandmember 返回表中一个随机元素 $redis -> srandmember ( 'set1' ) ; /** 有序set表操作 */ //sadd 增加元素,并设置序号,返回true,重复返回false $redis -> zadd ( 'zset1' , 1 , 'ab' ) ; $redis -> zadd ( 'zset1' , 2 , 'cd' ) ; $redis -> zadd ( 'zset1' , 3 , 'ef' ) ; //zincrby 对指定元素索引值的增减,改变元素排列次序 $redis -> zincrby ( 'zset1' , 10 , 'ab' ) ; //返回11 //zrem 移除指定元素 $redis -> zrem ( 'zset1' , 'ef' ) ; //true or false //zrange 按位置次序返回表中指定区间的元素 $redis -> zrange ( 'zset1' , 0 , 1 ) ; //返回位置0和1之间(两个)的元素 $redis -> zrange ( 'zset1' , 0 ,- 1 ) ; //返回位置0和倒数第一个元素之间的元素(相当于所有元素) //zrevrange 同上,返回表中指定区间的元素,按次序倒排 $redis -> zrevrange ( 'zset1' , 0 ,- 1 ) ; //元素顺序和zrange相反 //zrangebyscore/zrevrangebyscore 按顺序/降序返回表中指定索引区间的元素 $redis -> zadd ( 'zset1' , 3 , 'ef' ) ; $redis -> zadd ( 'zset1' , 5 , 'gh' ) ; $redis -> zrangebyscore ( 'zset1' , 2 , 9 ) ; //返回索引值2-9之间的元素 array('ef','gh') //参数形式 $redis -> zrangebyscore ( 'zset1' , 2 , 9 , 'withscores' ) ; //返回索引值2-9之间的元素并包含索引值 array(array('ef',3),array('gh',5)) $redis -> zrangebyscore ( 'zset1' , 2 , 9 , array ( 'withscores' => true , 'limit' => array ( 1 , 2 ) ) ) ; //返回索引值2-9之间的元素,'withscores' =>true表示包含索引值; 'limit'=>array(1, 2),表示最多返回2条,结果为array(array('ef',3),array('gh',5)) //zunionstore/zinterstore 将多个表的并集/交集存入另一个表中 $redis -> zunionstore ( 'zset3' , array ( 'zset1' , 'zset2' , 'zset0' ) ) ; //将'zset1','zset2','zset0'的并集存入'zset3' //其它参数 $redis -> zunionstore ( 'zset3' , array ( 'zset1' , 'zset2' ) , array ( 'weights' => array ( 5 , 0 ) ) ) ; //weights参数表示权重,其中表示并集后值大于5的元素排在前,大于0的排在后 $redis -> zunionstore ( 'zset3' , array ( 'zset1' , 'zset2' ) , array ( 'aggregate' => 'max' ) ) ; //'aggregate' => 'max'或'min'表示并集后相同的元素是取大值或是取小值 //zcount 统计一个索引区间的元素个数 $redis -> zcount ( 'zset1' , 3 , 5 ) ; //2 $redis -> zcount ( 'zset1' , '(3' , 5 ) ) ; //'(3'表示索引值在3-5之间但不含3,同理也可以使用'(5'表示上限为5但不含5 //zcard 统计元素个数 $redis -> zcard ( 'zset1' ) ; //4 //zscore 查询元素的索引 $redis -> zscore ( 'zset1' , 'ef' ) ; //3 //zremrangebyscore 删除一个索引区间的元素 $redis -> zremrangebyscore ( 'zset1' , 0 , 2 ) ; //删除索引在0-2之间的元素('ab','cd'),返回删除元素个数2 //zrank/zrevrank 返回元素所在表顺序/降序的位置(不是索引) $redis -> zrank ( 'zset1' , 'ef' ) ; //返回0,因为它是第一个元素;zrevrank则返回1(最后一个) //zremrangebyrank 删除表中指定位置区间的元素 $redis -> zremrangebyrank ( 'zset1' , 0 , 10 ) ; //删除位置为0-10的元素,返回删除的元素个数2 /** hash表操作 */ //hset/hget 存取hash表的数据 $redis -> hset ( 'hash1' , 'key1' , 'v1' ) ; //将key为'key1' value为'v1'的元素存入hash1表 $redis -> hset ( 'hash1' , 'key2' , 'v2' ) ; $redis -> hget ( 'hash1' , 'key1' ) ; //取出表'hash1'中的key 'key1'的值,返回'v1' //hexists 返回hash表中的指定key是否存在 $redis -> hexists ( 'hash1' , 'key1' ) ; //true or false //hdel 删除hash表中指定key的元素 $redis -> hdel ( 'hash1' , 'key2' ) ; //true or false //hlen 返回hash表元素个数 $redis -> hlen ( 'hash1' ) ; //1 //hsetnx 增加一个元素,但不能重复 $redis -> hsetnx ( 'hash1' , 'key1' , 'v2' ) ; //false $redis -> hsetnx ( 'hash1' , 'key2' , 'v2' ) ; //true //hmset/hmget 存取多个元素到hash表 $redis -> hmset ( 'hash1' , array ( 'key3' => 'v3' , 'key4' => 'v4' ) ) ; $redis -> hmget ( 'hash1' , array ( 'key3' , 'key4' ) ) ; //返回相应的值 array('v3','v4') //hincrby 对指定key进行累加 $redis -> hincrby ( 'hash1' , 'key5' , 3 ) ; //返回3 $redis -> hincrby ( 'hash1' , 'key5' , 10 ) ; //返回13 //hkeys 返回hash表中的所有key $redis -> hkeys ( 'hash1' ) ; //返回array('key1','key2','key3','key4','key5') //hvals 返回hash表中的所有value $redis -> hvals ( 'hash1' ) ; //返回array('v1','v2','v3','v4',13) //hgetall 返回整个hash表元素 $redis -> hgetall ( 'hash1' ) ; //返回array('key1'=>'v1','key2'=>'v2','key3'=>'v3','key4'=>'v4','key5'=>13) /** 排序操作 */ //sort 排序 $redis -> rpush ( 'tab' , 3 ) ; $redis -> rpush ( 'tab' , 2 ) ; $redis -> rpush ( 'tab' , 17 ) ; $redis -> sort ( 'tab' ) ; //返回array(2,3,17) //使用参数,可组合使用 array('sort' => 'desc','limit' => array(1, 2)) $redis -> sort ( 'tab' , array ( 'sort' => 'desc' ) ) ; //降序排列,返回array(17,3,2) $redis -> sort ( 'tab' , array ( 'limit' => array ( 1 , 2 ) ) ) ; //返回顺序位置中1的元素2个(这里的2是指个数,而不是位置),返回array(3,17) $redis -> sort ( 'tab' , array ( 'limit' => array ( 'alpha' => true ) ) ) ; //按首字符排序返回array(17,2,3),因为17的首字符是'1'所以排首位置 $redis -> sort ( 'tab' , array ( 'limit' => array ( 'store' => 'ordered' ) ) ) ; //表示永久性排序,返回元素个数 $redis -> sort ( 'tab' , array ( 'limit' => array ( 'get' => 'pre_*' ) ) ) ; //使用了通配符'*'过滤元素,表示只返回以'pre_'开头的元素 /** redis管理操作 */ //select 指定要操作的数据库 $redis -> select ( 'mydb' ) ; //指定为mydb,不存在则创建 //flushdb 清空当前库 $redis -> flushdb ( ) ; //move 移动当库的元素到其它库 $redis -> set ( 'foo' , 'bar' ) ; $redis -> move ( 'foo' , 'mydb2' ) ; //若'mydb2'库存在 //info 显示服务当状态信息 $redis -> info ( ) ; //slaveof 配置从服务器 $redis -> slaveof ( '127.0.0.1' , 80 ) ; //配置127.0.0.1端口80的服务器为从服务器 $redis -> slaveof ( ) ; //清除从服务器 //同步保存服务器数据到磁盘 $redis -> save ( ) ; //异步保存服务器数据到磁盘 $redis -> bgsave ( ) ; //?? $redis -> bgrewriteaof ( ) ; //返回最后更新磁盘的时间 $redis -> lastsave ( ) ; //set/get多个key-value $mkv = array ( 'usr:0001' => 'First user' , 'usr:0002' => 'Second user' , 'usr:0003' => 'Third user' ) ; $redis -> mset ( $mkv ) ; //存储多个key对应的value $retval = $redis -> mget ( array_keys ( $mkv ) ) ; //获取多个key对应的value print_r ( $retval ) ; //批量操作 $replies = $redis -> pipeline ( function ( $pipe ) { $pipe -> ping ( ) ; $pipe -> flushdb ( ) ; $pipe -> incrby ( 'counter' , 10 ) ; //增量操作 $pipe -> incrby ( 'counter' , 30 ) ; $pipe -> exists ( 'counter' ) ; $pipe -> get ( 'counter' ) ; $pipe -> mget ( 'does_not_exist' , 'counter' ) ; } ) ; print_r ( $replies ) ; //CAS,事务性操作 function zpop ( $client , $zsetKey ) { $element = null ; $options = array ( 'cas' => true , // Initialize with support for CAS operations 'watch' => $zsetKey , // Key that needs to be WATCHed to detect changes 'retry' => 3 , // Number of retries on aborted transactions, after // which the client bails out with an exception. ) ; $txReply = $client -> multiExec ( $options , function ( $tx ) use ( $zsetKey , & $element ) { @ list ( $element ) = $tx -> zrange ( $zsetKey , 0 , 0 ) ; if ( isset ( $element ) ) { $tx -> multi ( ) ; // With CAS, MULTI *must* be explicitly invoked. $tx -> zrem ( $zsetKey , $element ) ; } } ) ; return $element ; } $zpopped = zpop ( $redis , 'zset' ) ; echo isset ( $zpopped ) ? "ZPOPed $zpopped" : "Nothing to ZPOP!" , "\n" ; //对存取的key加前缀,如: 'nrk:' $redis -> getProfile ( ) -> setPreprocessor ( new KeyPrefixPreprocessor ( 'nrk:' ) ) ; //分布式存储的一些方法 $multiple_servers = array ( array ( 'host' => '127.0.0.1' , 'port' => 6379 , 'database' => 15 , 'alias' => 'first' , ) , array ( 'host' => '127.0.0.1' , 'port' => 6380 , 'database' => 15 , 'alias' => 'second' , ) , ) ; use Predis\Distribution\IDistributionStrategy ; class NaiveDistributionStrategy implements IDistributionStrategy { private $_nodes , $_nodesCount ; public function __constructor ( ) { $this ->_nodes = array ( ) ; $this ->_nodesCount = 0 ; } public function add ( $node , $weight = null ) { $this ->_nodes [ ] = $node ; $this ->_nodesCount ++; } public function remove ( $node ) { $this ->_nodes = array_filter ( $this ->_nodes , function ( $n ) use ( $node ) { return $n !== $node ; } ) ; $this ->_nodesCount = count ( $this ->_nodes ) ; } public function get ( $key ) { $count = $this ->_nodesCount ; if ( $count === 0 ) { throw new RuntimeException ( 'No connections' ) ; } return $this ->_nodes [ $count > 1 ? abs ( crc32 ( $key ) % $count ) : 0 ] ; } public function generateKey ( $value ) { return crc32 ( $value ) ; } } //配置键分布策略 $options = array ( 'key_distribution' => new NaiveDistributionStrategy ( ) , ) ; $redis = new Predis\Client ( $multiple_servers , $options ) ; for ( $i = 0 ; $i set ( "key:$i" , str_pad ( $i , 4 , '0' , 0 ) ) ; $redis -> get ( "key:$i" ) ; } $server1 = $redis -> getClientFor ( 'first' ) -> info ( ) ; $server2 = $redis -> getClientFor ( 'second' ) -> info ( ) ; printf ( "Server '%s' has %d keys while server '%s' has %d keys.\n" , 'first' , $server1 [ 'db15' ] [ 'keys' ] , 'second' , $server2 [ 'db15' ] [ 'keys' ] ) ;
2022年06月21日
405 阅读
0 评论
0 点赞
2022-06-21
【PHP】好用的PHP函数集合-在线版
string函数:http://www.w3school.com.cn/php/php_ref_string.asp array函数:http://www.w3school.com.cn/php/php_ref_array.asp 日期函数:http://www.w3school.com.cn/php/php_ref_date.asp 日历函数:http://www.w3school.com.cn/php/php_ref_calendar.asp 目录函数:http://www.w3school.com.cn/php/php_ref_directory.asp 数学函数:http://php.net/manual/zh/ref.math.php
2022年06月21日
319 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP实现驼峰转下划线
function to_slash($array) { // 先转成json字符串,进行正则替换,再转换为数组 $tmp = json_encode($array); $tmp = strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $tmp)); $tmp = json_decode($tmp, true); return $tmp; } 原理: // 驼峰转下划线 // 先添加分隔符,再转成小写 // userId => user_id $str = preg_replace('/((?<=[a-z])(?=[A-Z]))/','_',$str); $str = strtolower($str); // 下划线转驼峰 // 同样先添加分隔符,再转成大写 // user_id => userId $array = explode('_',$str); array_walk($array,create_function('&$v','$v=ucwords($v);')); $str = implode('',$array); // 首字母转小写 $str{0} = strtolower($str{0})
2022年06月19日
251 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP地理位置计算
<?php /** *求两个已知经纬度之间的距离,单位为米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位米 **/ function getdistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度 $radLat2=deg2rad($lat2); $radLng1=deg2rad($lng1); $radLng2=deg2rad($lng2); $a=$radLat1-$radLat2; $b=$radLng1-$radLng2; $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000; return intval($s); } function distanceConvert($s){ $s = intval($s); if($s <= 0){ return '附近'; }elseif($s > 0 && $s <= 1000){ return $s.'m'; }elseif($s > 1000 && $s <= 2000){ return '<2km'; }elseif($s > 2000 && $s <= 3000){ return '<3km'; }elseif($s > 3000 && $s <= 4000){ return '<4km'; }elseif($s > 4000 && $s <= 5000){ return '<5km'; }elseif($s > 5000){ return '>5km'; } } /** * 根据条件获取商户列表 * @param string $lng * @param string $lat * @param string $city_id * @param string $district_id * @param string $type_id * @param string $search * @return mixed */ //如果存在经纬度则考虑范围5公里内数据,如果不存在经纬度,则不考虑 public function GetShopList($navigationId = 0,$page = 1,$size =10 ,$lng = '', $lat ='', $city_id = '',$district_id = '',$type_id = '',$search = '') { $field = 'id,province_id,city_id,district_id,navigation_id,type_id,name,phone,address,logo,stime,etime,rule,activity,discount,latitude,longitude,status,token,sort,description,gmt_created'; $where = array( 'is_deleted' => 0, 'is_show' => 1, 'navigation_id'=>$navigationId, ); //判断城市,县区,分类是否存在 if(!empty($city_id)){ $where['city_id|province_id'] = $city_id; } if(!empty($district_id)){ $where['district_id'] = $district_id; } if(!empty($type_id)){ $where['type_id'] = $type_id; } if(!empty($search)){ $where['name'] = array('like',"%{$search}%"); } $offset = ($page * $size) - ($size - 1); //如果存在经纬度,就根据经纬度查询5公里范围内数据 if(!empty($lng) && !empty($lat)) { // //求出半径 // $radius = 5;//半径范围,单位km // $rangeLat = 180 / pi() * $radius / 6372.797;//纬度范围 // $rangeLng = $rangeLat / cos($lat * pi() / 180.0); //经度范围 // $maxLat = $lat + $rangeLat; //x1 // $minLat = $lat - $rangeLat; //x0 // $maxLng = $lng + $rangeLng; //y1 // $minLng = $lng - $rangeLng; //y0 // // $where['latitude'] = array(array('lt',$maxLat),array('gt',$minLat)); // $where['longitude'] = array(array('lt',$maxLng),array('gt',$minLng)); $list = $this->where($where)->field($field)->order("abs(longitude - {$lng}) + abs(latitude - {$lat})")->limit($offset,$size)->select(); }else{ $list = $this->where($where)->field($field)->order('sort asc')->limit($offset,$size)->select(); } //记录错误日志 if ($list === false) { wLog('GetShopList error! sql:' . $this->getLastSql(), $this->errorFile); wLog('GetShopList error! errorInfo:' . $this->error, $this->errorFile); } //wLog('GetShopList sql:' . $this->getLastSql(), $this->errorFile); return $list; }
2022年06月19日
291 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP原生生成EXCEL
<?php /*** * 生成excle文件 ***/ $time = time(); $filename = date("Y年m月d日h点m分s秒", $time).'问卷数据'; $rows = Sp_Looks_Vote::downvote(); $file = $filename.".csv"; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); $tabletitle .= "购买地址,常常购买,喜欢模特,内容如何,印象如何,是否购买,感觉如何,购买方式,购买方式建议,吸引点,改进建议"; $conter = iconv('utf-8','gbk',$tabletitle)."\n"; echo $conter;die; /*** * 生成word文件 ***/ header("Content-Type: application/msword"); header("Content-Disposition: attachment; filename=doc.doc"); header("Pragma: no-cache"); header("Expires: 0"); $output = '<table border="1" cellspacing="2" cellpadding="2" width="90%" align="center">'; $output .= '<tr bgcolor="#cccccc"><td align="center">图片</td></tr>'; $output .= '<tr bgcolor="#f6f7fa"><td><span style="color:#FF0000;"><strong>下面是一张图片</strong></span& gt;</td></tr>'; $output .= '<tr><td align="center"><img src="http://zi.csdn.net/48260_2.gif"></td></tr>'; $output .= '</table>'; echo $output; ?>
2022年06月19日
332 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP的邮件发送类
<?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件的邮件 * 需要的php扩展,sockets和Fileinfo。 * @example * $mail = new MySendMail(); * $mail->setServer("XXXXX", "XXXXX@XXXXX", "XXXXX"); 设置smtp服务器 * $mail->setFrom("XXXXX"); 设置发件人 * $mail->setReceiver("XXXXX"); 设置收件人,多个收件人,调用多次 * $mail->setCc("XXXX"); 设置抄送,多个抄送,调用多次 * $mail->setBcc("XXXXX"); 设置秘密抄送,多个秘密抄送,调用多次 * $mail->setMailInfo("test", "<b>test</b>"); 设置邮件主题、内容 * $mail->sendMail(); 发送 */ class MySendMail { /** * @var string 邮件传输代理用户名 * @access private */ private $_userName; /** * @var string 邮件传输代理密码 * @access private */ private $_password; /** * @var string 邮件传输代理服务器地址 * @access protected */ protected $_sendServer; /** * @var int 邮件传输代理服务器端口 * @access protected */ protected $_port=25; /** * @var string 发件人 * @access protected */ protected $_from; /** * @var string 收件人 * @access protected */ protected $_to; /** * @var string 抄送 * @access protected */ protected $_cc; /** * @var string 秘密抄送 * @access protected */ protected $_bcc; /** * @var string 主题 * @access protected */ protected $_subject; /** * @var string 邮件正文 * @access protected */ protected $_body; /** * @var string 附件 * @access protected */ protected $_attachment; /** * @var reource socket资源 * @access protected */ protected $_socket; /** * @var string 错误信息 * @access protected */ protected $_errorMessage; /** * 设置邮件传输代理,如果是可以匿名发送有邮件的服务器,只需传递代理服务器地址就行 * @access public * @param string $server 代理服务器的ip或者域名 * @param string $username 认证账号 * @param string $password 认证密码 * @param int $port 代理服务器的端口,smtp默认25号端口 * @return boolean */ public function setServer($server, $username="", $password="", $port=25) { $this->_sendServer = $server; $this->_port = $port; if(!empty($username)) { $this->_userName = base64_encode($username); } if(!empty($password)) { $this->_password = base64_encode($password); } return true; } /** * 设置发件人 * @access public * @param string $from 发件人地址 * @return boolean */ public function setFrom($from) { $this->_from = $from; return true; } /** * 设置收件人,多个收件人,连续调用多次. * @access public * @param string $to 收件人地址 * @return boolean */ public function setReceiver($to) { if(isset($this->_to)) { if(is_string($this->_to)) { $this->_to = array($this->_to); $this->_to[] = $to; return true; } elseif(is_array($this->_to)) { $this->_to[] = $to; return true; } else { return false; } } else { $this->_to = $to; return true; } } /** * 设置抄送,多个抄送,连续调用多次. * @access public * @param string $cc 抄送地址 * @return boolean */ public function setCc($cc) { if(isset($this->_cc)) { if(is_string($this->_cc)) { $this->_cc = array($this->_cc); $this->_cc[] = $cc; return true; } elseif(is_array($this->_cc)) { $this->_cc[] = $cc; return true; } else { return false; } } else { $this->_cc = $cc; return true; } } /** * 设置秘密抄送,多个秘密抄送,连续调用多次 * @access public * @param string $bcc 秘密抄送地址 * @return boolean */ public function setBcc($bcc) { if(isset($this->_bcc)) { if(is_string($this->_bcc)) { $this->_bcc = array($this->_bcc); $this->_bcc[] = $bcc; return true; } elseif(is_array($this->_bcc)) { $this->_bcc[] = $bcc; return true; } else { return false; } } else { $this->_bcc = $bcc; return true; } } /** * 设置邮件信息 * @access public * @param string $body 邮件主题 * @param string $subject 邮件主体内容,可以是纯文本,也可是是HTML文本 * @param string $attachment 附件,文件地址 * @return boolean */ public function setMailInfo($subject, $body, $attachment="") { $this->_subject = $subject; $this->_body = base64_encode($body); if(!empty($attachment)) { $this->_attachment = $attachment; } return true; } /** * 发送邮件 * @access public * @return boolean */ public function sendMail() { $command = $this->getCommand(); $this->socket(); foreach ($command as $value) { if($this->sendCommand($value[0], $value[1])) { continue; } else{ return false; } } //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放 $this->close(); echo 'Mail OK!'; return true; } /** * 返回错误信息 * @return string */ public function error(){ if(!isset($this->_errorMessage)) { $this->_errorMessage = ""; } return $this->_errorMessage; } /** * 返回mail命令 * @access protected * @return array */ protected function getCommand() { $command = array( array("HELO sendmail\r\n", 250) ); if(!empty($this->_userName)){ $command[] = array("AUTH LOGIN\r\n", 334); $command[] = array($this->_userName . "\r\n", 334); $command[] = array($this->_password . "\r\n", 235); } $command[] = array("MAIL FROM:<" . $this->_from . ">\r\n", 250); $separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); //分隔符 //设置发件人 $header = "FROM: test<" . $this->_from . ">\r\n"; //设置收件人 if(is_array($this->_to)) { $count = count($this->_to); for($i=0; $i<$count; $i++){ $command[] = array("RCPT TO: <" . $this->_to[$i] . ">\r\n", 250); if($i == 0){ $header .= "TO: <" . $this->_to[$i] .">"; } elseif($i + 1 == $count){ $header .= ",<" . $this->_to[$i] .">\r\n"; } else{ $header .= ",<" . $this->_to[$i] .">"; } } } else{ $command[] = array("RCPT TO: <" . $this->_to . ">\r\n", 250); $header .= "TO: <" . $this->_to . ">\r\n"; } //设置抄送 if(isset($this->_cc)) { if(is_array($this->_cc)) { $count = count($this->_cc); for($i=0; $i<$count; $i++){ $command[] = array("RCPT TO: <" . $this->_cc[$i] . ">\r\n", 250); if($i == 0){ $header .= "CC: <" . $this->_cc[$i] .">"; } elseif($i + 1 == $count){ $header .= ",<" . $this->_cc[$i] .">\r\n"; } else{ $header .= ",<" . $this->_cc[$i] .">"; } } } else{ $command[] = array("RCPT TO: <" . $this->_cc . ">\r\n", 250); $header .= "CC: <" . $this->_cc . ">\r\n"; } } //设置秘密抄送 if(isset($this->_bcc)) { if(is_array($this->_bcc)) { $count = count($this->_bcc); for($i=0; $i<$count; $i++){ $command[] = array("RCPT TO: <" . $this->_bcc[$i] . ">\r\n", 250); if($i == 0){ $header .= "BCC: <" . $this->_bcc[$i] .">"; } elseif($i + 1 == $count){ $header .= ",<" . $this->_bcc[$i] .">\r\n"; } else{ $header .= ",<" . $this->_bcc[$i] .">"; } } } else{ $command[] = array("RCPT TO: <" . $this->_bcc . ">\r\n", 250); $header .= "BCC: <" . $this->_bcc . ">\r\n"; } } $header .= "Subject: " . $this->_subject ."\r\n"; if(isset($this->_attachment)) { //含有附件的邮件头需要声明成这个 $header .= "Content-Type: multipart/mixed;\r\n"; } elseif(false){ //邮件体含有图片资源的需要声明成这个 $header .= "Content-Type: multipart/related;\r\n"; } else{ //html或者纯文本的邮件声明成这个 $header .= "Content-Type: multipart/alternative;\r\n"; } //邮件头分隔符 $header .= "\t" . 'boundary="' . $separator . '"'; $header .= "\r\nMIME-Version: 1.0\r\n"; $header .= "\r\n--" . $separator . "\r\n"; $header .= "Content-Type:text/html; charset=utf-8\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n\r\n"; $header .= $this->_body . "\r\n"; $header .= "--" . $separator . "\r\n"; //加入附件 if(isset($this->_attachment)){ $header .= "\r\n--" . $separator . "\r\n"; $header .= "Content-Type: " . $this->getMIMEType() . '; name="' . basename($this->_attachment) . '"' . "\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= 'Content-Disposition: attachment; filename="' . basename($this->_attachment) . '"' . "\r\n"; $header .= "\r\n"; $header .= $this->readFile(); $header .= "\r\n--" . $separator . "\r\n"; } $header .= "\r\n.\r\n"; $command[] = array("DATA\r\n", 354); $command[] = array($header, 250); $command[] = array("QUIT\r\n", 221); return $command; } /** * 发送命令 * @access protected * @param string $command 发送到服务器的smtp命令 * @param int $code 期望服务器返回的响应吗 * @return boolean */ protected function sendCommand($command, $code) { echo 'Send command:' . $command . ',expected code:' . $code . '<br />'; //发送命令给服务器 try{ if(socket_write($this->_socket, $command, strlen($command))){ //当邮件内容分多次发送时,没有$code,服务器没有返回 if(empty($code)) { return true; } //读取服务器返回 $data = trim(socket_read($this->_socket, 1024)); echo 'response:' . $data . '<br /><br />'; if($data) { $pattern = "/^".$code."/"; if(preg_match($pattern, $data)) { return true; } else{ $this->_errorMessage = "Error:" . $data . "|**| command:"; return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } }catch(Exception $e) { $this->_errorMessage = "Error:" . $e->getMessage(); } } /** * 读取附件文件内容,返回base64编码后的文件内容 * @access protected * @return mixed */ protected function readFile() { if(isset($this->_attachment) && file_exists($this->_attachment)) { $file = file_get_contents($this->_attachment); return base64_encode($file); } else { return false; } } /** * 获取附件MIME类型 * @access protected * @return mixed */ protected function getMIMEType() { if(isset($this->_attachment) && file_exists($this->_attachment)) { $mime = mime_content_type($this->_attachment); if(! preg_match("/gif|jpg|png|jpeg/", $mime)){ $mime = "application/octet-stream"; } return $mime; } else { return false; } } /** * 建立到服务器的网络连接 * @access private * @return boolean */ private function socket() { if(!function_exists("socket_create")) { $this->_errorMessage = "Extension sockets must be enabled"; return false; } //创建socket资源 $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); if(!$this->_socket) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_set_block($this->_socket);//设置阻塞模式 //连接服务器 if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_read($this->_socket, 1024); return true; } /** * 关闭socket * @access private * @return boolean */ private function close() { if(isset($this->_socket) && is_object($this->_socket)) { $this->_socket->close(); return true; } $this->_errorMessage = "No resource can to be close"; return false; } } <?php /** * 邮件发送类 * 仅支持发送纯文本和HTML内容邮件 * 需要的php扩展,sockets * @example * $mail = new MySendMail(); * $mail->setServer("XXXXX", "XXXXX@XXXXX", "XXXXX"); 设置smtp服务器 * $mail->setFrom("XXXXX"); 设置发件人 * $mail->setReceiver("XXXXX"); 设置收件人 * $mail->setMailInfo("test", "<b>test</b>"); 设置邮件主题、内容 * $mail->sendMail(); 发送 */ class MySendMail2 { /** * @var string 邮件传输代理用户名 * @access private */ private $_userName; /** * @var string 邮件传输代理密码 * @access private */ private $_password; /** * @var string 邮件传输代理服务器地址 * @access private */ private $_sendServer; /** * @var int 邮件传输代理服务器端口 * @access protected */ protected $_port=25; /** * @var string 发件人 * @access protected */ protected $_from; /** * @var string 收件人 * @access protected */ protected $_to; /** * @var string 主题 * @access protected */ protected $_subject; /** * @var string 邮件正文 * @access protected */ protected $_body; /** * @var reource socket资源 * @access protected */ protected $_socket; /** * @var string 错误信息 * @access protected */ protected $_errorMessage; /** * 设置邮件传输代理,如果是可以匿名发送有邮件的服务器,只需传递代理服务器地址就行 * @access public * @param string $server 代理服务器的ip或者域名 * @param string $username 认证账号 * @param string $password 认证密码 * @param int $port 代理服务器的端口,smtp默认25号端口 * @return boolean */ public function setServer($server, $username="", $password="", $port=25) { $this->_sendServer = $server; $this->_port = $port; if(!empty($username)) { $this->_userName = base64_encode($username); } if(!empty($password)) { $this->_password = base64_encode($password); } return true; } /** * 设置发件人 * @access public * @param string $from 发件人地址 * @return boolean */ public function setFrom($from) { $this->_from = $from; return true; } /** * 设置收件人 * @access public * @param string $to 收件人地址 * @return boolean */ public function setReceiver($to) { $this->_to = $to; return true; } /** * 设置邮件信息 * @access public * @param string $body 邮件主题 * @param string $subject 邮件主体内容,可以是纯文本,也可是是HTML文本 * @return boolean */ public function setMailInfo($subject, $body) { $this->_subject = $subject; $this->_body = base64_encode($body); if(!empty($attachment)) { $this->_attachment = $attachment; } return true; } /** * 发送邮件 * @access public * @return boolean */ public function sendMail() { $command = $this->getCommand(); $this->socket(); foreach ($command as $value) { if($this->sendCommand($value[0], $value[1])) { continue; } else{ return false; } } //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放 $this->close(); echo 'Mail OK!'; return true; } /** * 返回错误信息 * @return string */ public function error(){ if(!isset($this->_errorMessage)) { $this->_errorMessage = ""; } return $this->_errorMessage; } /** * 返回mail命令 * @access protected * @return array */ protected function getCommand() { $separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); //分隔符 $command = array( array("HELO sendmail\r\n", 250) ); if(!empty($this->_userName)){ $command[] = array("AUTH LOGIN\r\n", 334); $command[] = array($this->_userName . "\r\n", 334); $command[] = array($this->_password . "\r\n", 235); } //设置发件人 $command[] = array("MAIL FROM: <" . $this->_from . ">\r\n", 250); $header = "FROM: <" . $this->_from . ">\r\n"; //设置收件人 $command[] = array("RCPT TO: <" . $this->_to . ">\r\n", 250); $header .= "TO: <" . $this->_to . ">\r\n"; $header .= "Subject: " . $this->_subject ."\r\n"; $header .= "Content-Type: multipart/alternative;\r\n"; //邮件头分隔符 $header .= "\t" . 'boundary="' . $separator . '"'; $header .= "\r\nMIME-Version: 1.0\r\n"; $header .= "\r\n--" . $separator . "\r\n"; $header .= "Content-Type:text/html; charset=utf-8\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n\r\n"; $header .= $this->_body . "\r\n"; $header .= "--" . $separator . "\r\n"; //结束数据 $header .= "\r\n.\r\n"; $command[] = array("DATA\r\n", 354); $command[] = array($header, 250); $command[] = array("QUIT\r\n", 221); return $command; } /** * 发送命令 * @access protected * @param string $command 发送到服务器的smtp命令 * @param int $code 期望服务器返回的响应吗 * @return boolean */ protected function sendCommand($command, $code) { echo 'Send command:' . $command . ',expected code:' . $code . '<br />'; //发送命令给服务器 try{ if(socket_write($this->_socket, $command, strlen($command))){ //当邮件内容分多次发送时,没有$code,服务器没有返回 if(empty($code)) { return true; } //读取服务器返回 $data = trim(socket_read($this->_socket, 1024)); echo 'response:' . $data . '<br /><br />'; if($data) { $pattern = "/^".$code."/"; if(preg_match($pattern, $data)) { return true; } else{ $this->_errorMessage = "Error:" . $data . "|**| command:"; return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } }catch(Exception $e) { $this->_errorMessage = "Error:" . $e->getMessage(); } } /** * 建立到服务器的网络连接 * @access private * @return boolean */ private function socket() { if(!function_exists("socket_create")) { $this->_errorMessage = "Extension sockets must be enabled"; return false; } //创建socket资源 $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); if(!$this->_socket) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_set_block($this->_socket);//设置阻塞模式 //连接服务器 if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_read($this->_socket, 1024); return true; } /** * 关闭socket * @access private * @return boolean */ private function close() { if(isset($this->_socket) && is_object($this->_socket)) { $this->_socket->close(); return true; } $this->_errorMessage = "No resource can to be close"; return false; } } /**************************** Test ***********************************/ // $mail = new MySendMail(); // $mail->setServer("XXXX", "XXXXX@XXXXX", "XXXX"); // $mail->setFrom("XXXXX@XXXXX"); // $mail->setReceiver("XXXXX@XXXXX"); // $mail->setMailInfo("test", "<b>test</b>"); // $mail->sendMail(); ?>
2022年06月19日
337 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP获取汉字首个拼音
function getFirstChar($s0) { //ord() 函数返回字符串的首个字符的 ASCII 值 $fchar = ord($s0{0}); if ($fchar >= ord("A") and $fchar <= ord("z")) return strtoupper($s0{0}); $s1 = iconv("UTF-8", "gb2312", $s0); $s2 = iconv("gb2312", "UTF-8", $s1); if ($s2 == $s0) { $s = $s1; } else { $s = $s0; } $asc = ord($s{0}) * 256 + ord($s{1}) - 65536; if ($asc >= -20319 and $asc <= -20284) return "A"; if ($asc >= -20283 and $asc <= -19776) return "B"; if ($asc >= -19775 and $asc <= -19219) return "C"; if ($asc >= -19218 and $asc <= -18711) return "D"; if ($asc >= -18710 and $asc <= -18527) return "E"; if ($asc >= -18526 and $asc <= -18240) return "F"; if ($asc >= -18239 and $asc <= -17923) return "G"; if ($asc >= -17922 and $asc <= -17418) return "I"; if ($asc >= -17417 and $asc <= -16475) return "J"; if ($asc >= -16474 and $asc <= -16213) return "K"; if ($asc >= -16212 and $asc <= -15641) return "L"; if ($asc >= -15640 and $asc <= -15166) return "M"; if ($asc >= -15165 and $asc <= -14923) return "N"; if ($asc >= -14922 and $asc <= -14915) return "O"; if ($asc >= -14914 and $asc <= -14631) return "P"; if ($asc >= -14630 and $asc <= -14150) return "Q"; if ($asc >= -14149 and $asc <= -14091) return "R"; if ($asc >= -14090 and $asc <= -13319) return "S"; if ($asc >= -13318 and $asc <= -12839) return "T"; if ($asc >= -12838 and $asc <= -12557) return "W"; if ($asc >= -12556 and $asc <= -11848) return "X"; if ($asc >= -11847 and $asc <= -11056) return "Y"; if ($asc >= -11055 and $asc <= -10247) return "Z"; return null; } function chinesePhoneticize($zh) { $ret = ""; $s1 = iconv("UTF-8", "gb2312", $zh); $s2 = iconv("gb2312", "UTF-8", $s1); if ($s2 == $zh) { $zh = $s1; } for ($i = 0; $i < strlen($zh); $i++) { $s1 = substr($zh, $i, 1); $p = ord($s1); if ($p > 160) { $s2 = substr($zh, $i++, 2); $ret .= getfirstchar($s2); } else { $ret .= $s1; } } return $ret; } echo "这是中文字符串<br/>"; echo pinyin1('这是中文字符串');
2022年06月19日
397 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP根据身份证号获取星座
<?php // 根据身份证号,自动返回对应的星座 function get_xingzuo($cid) { $cid = getIDCard($cid); if (!isIdCard($cid)) return ''; $bir = substr($cid,10,4); $month = (int)substr($bir,0,2); $day = (int)substr($bir,2); $strValue = ''; if (($month == 1 && $day >= 20) || ($month == 2 && $day <= 18)) { $strValue = "水瓶座"; } else if (($month == 2 && $day >= 19) || ($month == 3 && $day <= 20)) { $strValue = "双鱼座"; } else if (($month == 3 && $day > 20) || ($month == 4 && $day <= 19)) { $strValue = "白羊座"; } else if (($month == 4 && $day >= 20) || ($month == 5 && $day <= 20)) { $strValue = "金牛座"; } else if (($month == 5 && $day >= 21) || ($month == 6 && $day <= 21)) { $strValue = "双子座"; } else if (($month == 6 && $day > 21) || ($month == 7 && $day <= 22)) { $strValue = "巨蟹座"; } else if (($month == 7 && $day > 22) || ($month == 8 && $day <= 22)) { $strValue = "狮子座"; } else if (($month == 8 && $day >= 23) || ($month == 9 && $day <= 22)) { $strValue = "处女座"; } else if (($month == 9 && $day >= 23) || ($month == 10 && $day <= 23)) { $strValue = "天秤座"; } else if (($month == 10 && $day > 23) || ($month == 11 && $day <= 22)) { $strValue = "天蝎座"; } else if (($month == 11 && $day > 22) || ($month == 12 && $day <= 21)) { $strValue = "射手座"; } else if (($month == 12 && $day > 21) || ($month == 1 && $day <= 19)) { $strValue = "魔羯座"; } return $strValue; } // 根据身份证号,自动返回对应的生肖 function get_shengxiao($cid) { $cid = getIDCard($cid); if (!isIdCard($cid)) return ''; $start = 1901; $end = $end = (int)substr($cid,6,4); $x = ($start - $end) % 12; $value = ""; if ($x == 1 || $x == -11) {$value = "鼠";} if ($x == 0) { $value = "牛";} if ($x == 11 || $x == -1) {$value = "虎";} if ($x == 10 || $x == -2) {$value = "兔";} if ($x == 9 || $x == -3) {$value = "龙";} if ($x == 8 || $x == -4) {$value = "蛇";} if ($x == 7 || $x == -5) {$value = "马";} if ($x == 6 || $x == -6) {$value = "羊";} if ($x == 5 || $x == -7) {$value = "猴";} if ($x == 4 || $x == -8) {$value = "鸡";} if ($x == 3 || $x == -9) {$value = "狗";} if ($x == 2 || $x == -10) {$value = "猪";} return $value; } function get_xingbie($cid,$comm=0) { //根据身份证号,自动返回性别 $cid = getIDCard($cid); if (!isIdCard($cid)) return ''; $sexint = (int)substr($cid,16,1); if($comm >0){ return $sexint % 2 === 0 ? '女士' : '先生'; }else{ return $sexint % 2 === 0 ? '女' : '男'; } } // 功能:把15位身份证转换成18位 function getIDCard($idCard) { // 若是15位,则转换成18位;否则直接返回ID if (15 == strlen ( $idCard )) { $W = array (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1 ); $A = array ("1","0","X","9","8","7","6","5","4","3","2" ); $s = 0; $idCard18 = substr ( $idCard, 0, 6 ) . "19" . substr ( $idCard, 6 ); $idCard18_len = strlen ( $idCard18 ); for($i = 0; $i < $idCard18_len; $i ++) { $s = $s + substr ( $idCard18, $i, 1 ) * $W [$i]; } $idCard18 .= $A [$s % 11]; return $idCard18; } else { return $idCard; } } ?>
2022年06月19日
300 阅读
0 评论
0 点赞
2022-06-19
【PHP】数据校验规则
/** * @name: check_data * @description: 检测数据规则 * @param: string 被检测的原字符串 * @param: string 被检测的类型 * @return: boolean * @create: 2014-10-10 **/ function check_data($string, $type='email'){ $return = FALSE; switch($type){ case 'email' : {$return = preg_match("/^(\w+[-+.]*\w+)*@(\w+([-.]*\w+)*\.\w+([-.]*\w+)*)$/", $string); break;} case 'http' : {$return = preg_match("/^http:\/\/[A-Za-z0-9-]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"])*$/", $string); break;} case 'qq' : {$return = preg_match("/^[1-9]\d{4,11}$/", $string); break;} case 'post' : {$return = preg_match("/^[1-9]\d{5}$/", $string); break;} case 'idnum' : {$return = preg_match("/^\d{15}(\d{2}[A-Za-z0-9])?$/", $string); break;} case 'china' : {$return = preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $string); break;} //GBK中文 case 'english' : {$return = preg_match("/^[A-Za-z]+$/", $string); break;} case 'mobile' : {$return = preg_match("/^((\(\d{3}\))|(\d{3}\-))?((13)|(14)|(15)|(17)|(18)){1}\d{9}$/", $string); break;} case 'phone' : {$return = preg_match("/^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/", $string); break;} case 'safe' : {$return = preg_match("/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/", $string) != 0 ? TRUE : FALSE; break;} case 'age' : {$return = (preg_match("/^(-{0,1}|\+{0,1})[0-9]+(\.{0,1}[0-9]+)$/", $string) && intval($string) <= 130 && intval($string) >= 12) ? TRUE : FALSE; break;} case 'eng_num' : {$return = preg_match("/^[A-Za-z0-9]+$/", $string); break;} case 'password' : {$return = (preg_match("/^[A-Za-z0-9]+$/", $string) && strlen($string) <= 32 && strlen($string) >= 6) ? TRUE : FALSE; break;} case 'datetime' : {$return = preg_match('/^[\d]{4}-[\d]{1,2}-[\d]{1,2}\s[\d]{1,2}:[\d]{1,2}:[\d]{1,2}$/', $string); break;} case 'datetimes' : {$return = preg_match('/^[\d]{4}-[\d]{2}-[\d]{2}\s[\d]{2}:[\d]{2}:[\d]{2}$/', $string); break;} case 'date' : {$return = preg_match('/^[\d]{4}-[\d]{1,2}-[\d]{1,2}$/', $string); break;} case 'dates' : {$return = preg_match('/^[\d]{4}-[\d]{2}-[\d]{2}$/', $string); break;} case 'time' : {$return = preg_match('/^[\d]{1,2}:[\d]{1,2}:[\d]{1,2}$/', $string); break;} case 'times' : {$return = preg_match('/^[\d]{2}:[\d]{2}:[\d]{2}$/', $string); break;} case 'ip' : {$return = preg_match("/^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b$/", $string); break;} case 'incchinese' : {$return = preg_match('/[\x{4e00}-\x{9fa5}]+/u', $string); break;} //是否包含中文 case 'plusnum' : {$return = preg_match('/^[1-9]*[1-9][0-9]*$/', $string); break;} //是否是正整数 case 'hostrecord' : {$return = preg_match('/^[A-Z_a-z0-9][A-Za-z0-9-]+(\.[A-Za-z0-9-_]+)*$/', $string); break;} //正确的主机记录,english case 'cnhostrecord' : {$return = preg_match('/^[_a-zA-Z0-9]*([\x{4e00}-\x{9fa5}]*[-a-zA-Z0-9\.]*)+[a-zA-Z0-9_]$/iu', $string); break;} //正确的主机记录,english chinese case 'domain' : {$return = preg_match('/^[A-Za-z0-9][A-Za-z0-9-]+(\.[A-Za-z0-9-]+){1,3}$/', $string); break;} //是否是域名 case 'cndomain' : {$return = (preg_match('/[\x{4e00}-\x{9fa5}]+/u', $string) && preg_match('/^([-a-zA-Z0-9\.]*[\x{4e00}-\x{9fa5}]*[-a-zA-Z0-9\.]*)+\.(中国|公司|网络|CN|COM|NET)$/iu', $string)) ? TRUE : FALSE; break;} //是否中文域名 case 'mac' : {$return = preg_match('/^[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}$/', $string); break;} case 'ipv6' : {$return = preg_match('/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/', $string); break;} } gettype($return) == 'integer' && $return = $return == 0 ? FALSE : TRUE; return $return; }
2022年06月19日
338 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP获取手机相关信息
<?php /* *该PHP操作类实现获取手机号 手机头信息,取UA,取得手机类型,判断是否是opera,判断是否是m3gate,取得HA,取得手机IP */ /** * @desc 手机操作类 获取手机相关信息 * @since */ class mobile { /** * 函数名称: getPhoneNumber * 函数功能: 取手机号 * 输入参数: none * 函数返回值: 成功返回号码,失败返回false * 其它说明: 说明 */ public function getPhoneNumber() { if (isset($_SERVER['HTTP_X_NETWORK_INFO'])) { $str1 = $_SERVER['HTTP_X_NETWORK_INFO']; $getstr1 = preg_replace('/(.*,)(11[d])(,.*)/i',"",$str1); Return $getstr1; }elseif (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])) { $getstr2 = $_SERVER['HTTP_X_UP_CALLING_LINE_ID']; Return $getstr2; }elseif (isset($_SERVER['HTTP_X_UP_SUBNO'])) { $str3 = $_SERVER['HTTP_X_UP_SUBNO']; $getstr3 = preg_replace('/(.*)(11[d])(.*)/i',"",$str3); Return $getstr3; }elseif (isset($_SERVER['DEVICEID'])) { Return $_SERVER['DEVICEID']; }else { Return false; } } /** * 函数名称: getHttpHeader * 函数功能: 取头信息 * 输入参数: none * 函数返回值: 成功返回号码,失败返回false * 其它说明: 说明 */ public function getHttpHeader() { $str = ""; foreach ($_SERVER as $key=>$val) { $gstr = str_replace("&","&",$val); $str.= "$key -> ".$gstr."rn"; } Return $str; } /** * 函数名称: getUA * 函数功能: 取UA * 输入参数: none * 函数返回值: 成功返回号码,失败返回false * 其它说明: 说明 */ public function getUA() { if (isset($_SERVER['HTTP_USER_AGENT'])) { Return $_SERVER['HTTP_USER_AGENT']; }else { Return false; } } /** * 函数名称: getPhoneType * 函数功能: 取得手机类型 * 输入参数: none * 函数返回值: 成功返回string,失败返回false * 其它说明: 说明 */ public function getPhoneType() { $ua = $this->getUA(); if($ua!=false) { $str = explode(" ",$ua); Return $str[0]; }else { Return false; } } /** * 函数名称: isOpera * 函数功能: 判断是否是opera * 输入参数: none www.knowsky.com * 函数返回值: 成功返回string,失败返回false * 其它说明: 说明 */ public function isOpera() { $uainfo = $this->getUA(); if (preg_match('/.*Opera.*/i',$uainfo)) { Return true; }else { Return false; } } /** * 函数名称: isM3gate * 函数功能: 判断是否是m3gate * 输入参数: none * 函数返回值: 成功返回string,失败返回false * 其它说明: 说明 */ public function isM3gate() { $uainfo = $this->getUA(); if (preg_match('/M3Gate/i',$uainfo)) { Return true; }else { Return false; } } /** * 函数名称: getHttpAccept * 函数功能: 取得HA * 输入参数: none * 函数返回值: 成功返回string,失败返回false * 其它说明: 说明 */ public function getHttpAccept() { if (isset($_SERVER['HTTP_ACCEPT'])) { Return $_SERVER['HTTP_ACCEPT']; }else { Return false; } } /** * 函数名称: getIP * 函数功能: 取得手机IP * 输入参数: none * 函数返回值: 成功返回string * 其它说明: 说明 */ public function getIP() { $ip=getenv('REMOTE_ADDR'); $ip_ = getenv('HTTP_X_FORWARDED_FOR'); if (($ip_ != "") && ($ip_ != "unknown")) { $ip=$ip_; } return $ip; } } ?>亲测手机号获取不到 ;可以考虑别的方法了,这里仅供参考
2022年06月19日
310 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP检测浏览器语言
如果你的网站上有多种语言,那么可以使用这段代码 作为默认的语言来检测浏览器语言。该段代码将返回 浏览器客户端使用的初始语言。 function get_client_language($availableLanguages, $default='en'){ if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $langs=explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']); foreach ($langs as $value){ $choice=substr($value,0,2); if(in_array($choice, $availableLanguages)){ return $choice; } } } return $default; }
2022年06月19日
269 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP实现字符串截取,支持中文和其他编码
<?php /** * 字符串截取,支持中文和其他编码 * @param [string] $str [字符串] * @param integer $start [起始位置] * @param integer $length [截取长度] * @param string $charset [字符串编码] * @param boolean $suffix [是否有省略号] * @return [type] [description] */ function msubstr($str, $start=0, $length=15, $charset="utf-8", $suffix=true) { if(function_exists("mb_substr")) { return mb_substr($str, $start, $length, $charset); } elseif(function_exists('iconv_substr')) { return iconv_substr($str,$start,$length,$charset); } $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; preg_match_all($re[$charset], $str, $match); $slice = join("",array_slice($match[0], $start, $length)); if($suffix) { return $slice."…"; } return $slice; } /* 这里的关键,$charset="utf-8",对中文支持是很重要的!不然出现一些?号,就要挨批了! 使用方法如下: echo msubstr($str, $start=0, $length=15, $charset="utf-8", $suffix=true) /*
2022年06月19日
322 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP实现中文转拼音
<?php /** * PHP 汉字转拼音 * @author Jerryli(hzjerry@gmail.com) * @version V0.20140715 * @package SPFW.core.lib.final * @global SEA_PHP_FW_VAR_ENV * @example * echo CUtf8_PY::encode('阿里巴巴科技有限公司'); //编码为拼音首字母 * echo CUtf8_PY::encode('阿里巴巴科技有限公司', 'all'); //编码为全拼音 */ class CUtf8_PY { /** * 拼音字符转换图 * @var array */ private static $_aMaps = array( 'a'=>-20319,'ai'=>-20317,'an'=>-20304,'ang'=>-20295,'ao'=>-20292, 'ba'=>-20283,'bai'=>-20265,'ban'=>-20257,'bang'=>-20242,'bao'=>-20230,'bei'=>-20051,'ben'=>-20036,'beng'=>-20032,'bi'=>-20026,'bian'=>-20002,'biao'=>-19990,'bie'=>-19986,'bin'=>-19982,'bing'=>-19976,'bo'=>-19805,'bu'=>-19784, 'ca'=>-19775,'cai'=>-19774,'can'=>-19763,'cang'=>-19756,'cao'=>-19751,'ce'=>-19746,'ceng'=>-19741,'cha'=>-19739,'chai'=>-19728,'chan'=>-19725,'chang'=>-19715,'chao'=>-19540,'che'=>-19531,'chen'=>-19525,'cheng'=>-19515,'chi'=>-19500,'chong'=>-19484,'chou'=>-19479,'chu'=>-19467,'chuai'=>-19289,'chuan'=>-19288,'chuang'=>-19281,'chui'=>-19275,'chun'=>-19270,'chuo'=>-19263,'ci'=>-19261,'cong'=>-19249,'cou'=>-19243,'cu'=>-19242,'cuan'=>-19238,'cui'=>-19235,'cun'=>-19227,'cuo'=>-19224, 'da'=>-19218,'dai'=>-19212,'dan'=>-19038,'dang'=>-19023,'dao'=>-19018,'de'=>-19006,'deng'=>-19003,'di'=>-18996,'dian'=>-18977,'diao'=>-18961,'die'=>-18952,'ding'=>-18783,'diu'=>-18774,'dong'=>-18773,'dou'=>-18763,'du'=>-18756,'duan'=>-18741,'dui'=>-18735,'dun'=>-18731,'duo'=>-18722, 'e'=>-18710,'en'=>-18697,'er'=>-18696, 'fa'=>-18526,'fan'=>-18518,'fang'=>-18501,'fei'=>-18490,'fen'=>-18478,'feng'=>-18463,'fo'=>-18448,'fou'=>-18447,'fu'=>-18446, 'ga'=>-18239,'gai'=>-18237,'gan'=>-18231,'gang'=>-18220,'gao'=>-18211,'ge'=>-18201,'gei'=>-18184,'gen'=>-18183,'geng'=>-18181,'gong'=>-18012,'gou'=>-17997,'gu'=>-17988,'gua'=>-17970,'guai'=>-17964,'guan'=>-17961,'guang'=>-17950,'gui'=>-17947,'gun'=>-17931,'guo'=>-17928, 'ha'=>-17922,'hai'=>-17759,'han'=>-17752,'hang'=>-17733,'hao'=>-17730,'he'=>-17721,'hei'=>-17703,'hen'=>-17701,'heng'=>-17697,'hong'=>-17692,'hou'=>-17683,'hu'=>-17676,'hua'=>-17496,'huai'=>-17487,'huan'=>-17482,'huang'=>-17468,'hui'=>-17454,'hun'=>-17433,'huo'=>-17427, 'ji'=>-17417,'jia'=>-17202,'jian'=>-17185,'jiang'=>-16983,'jiao'=>-16970,'jie'=>-16942,'jin'=>-16915,'jing'=>-16733,'jiong'=>-16708,'jiu'=>-16706,'ju'=>-16689,'juan'=>-16664,'jue'=>-16657,'jun'=>-16647, 'ka'=>-16474,'kai'=>-16470,'kan'=>-16465,'kang'=>-16459,'kao'=>-16452,'ke'=>-16448,'ken'=>-16433,'keng'=>-16429,'kong'=>-16427,'kou'=>-16423,'ku'=>-16419,'kua'=>-16412,'kuai'=>-16407,'kuan'=>-16403,'kuang'=>-16401,'kui'=>-16393,'kun'=>-16220,'kuo'=>-16216, 'la'=>-16212,'lai'=>-16205,'lan'=>-16202,'lang'=>-16187,'lao'=>-16180,'le'=>-16171,'lei'=>-16169,'leng'=>-16158,'li'=>-16155,'lia'=>-15959,'lian'=>-15958,'liang'=>-15944,'liao'=>-15933,'lie'=>-15920,'lin'=>-15915,'ling'=>-15903,'liu'=>-15889,'long'=>-15878,'lou'=>-15707,'lu'=>-15701,'lv'=>-15681,'luan'=>-15667,'lue'=>-15661,'lun'=>-15659,'luo'=>-15652, 'ma'=>-15640,'mai'=>-15631,'man'=>-15625,'mang'=>-15454,'mao'=>-15448,'me'=>-15436,'mei'=>-15435,'men'=>-15419,'meng'=>-15416,'mi'=>-15408,'mian'=>-15394,'miao'=>-15385,'mie'=>-15377,'min'=>-15375,'ming'=>-15369,'miu'=>-15363,'mo'=>-15362,'mou'=>-15183,'mu'=>-15180, 'na'=>-15165,'nai'=>-15158,'nan'=>-15153,'nang'=>-15150,'nao'=>-15149,'ne'=>-15144,'nei'=>-15143,'nen'=>-15141,'neng'=>-15140,'ni'=>-15139,'nian'=>-15128,'niang'=>-15121,'niao'=>-15119,'nie'=>-15117,'nin'=>-15110,'ning'=>-15109,'niu'=>-14941,'nong'=>-14937,'nu'=>-14933,'nv'=>-14930,'nuan'=>-14929,'nue'=>-14928,'nuo'=>-14926, 'o'=>-14922,'ou'=>-14921, 'pa'=>-14914,'pai'=>-14908,'pan'=>-14902,'pang'=>-14894,'pao'=>-14889,'pei'=>-14882,'pen'=>-14873,'peng'=>-14871,'pi'=>-14857,'pian'=>-14678,'piao'=>-14674,'pie'=>-14670,'pin'=>-14668,'ping'=>-14663,'po'=>-14654,'pu'=>-14645, 'qi'=>-14630,'qia'=>-14594,'qian'=>-14429,'qiang'=>-14407,'qiao'=>-14399,'qie'=>-14384,'qin'=>-14379,'qing'=>-14368,'qiong'=>-14355,'qiu'=>-14353,'qu'=>-14345,'quan'=>-14170,'que'=>-14159,'qun'=>-14151, 'ran'=>-14149,'rang'=>-14145,'rao'=>-14140,'re'=>-14137,'ren'=>-14135,'reng'=>-14125,'ri'=>-14123,'rong'=>-14122,'rou'=>-14112,'ru'=>-14109,'ruan'=>-14099,'rui'=>-14097,'run'=>-14094,'ruo'=>-14092, 'sa'=>-14090,'sai'=>-14087,'san'=>-14083,'sang'=>-13917,'sao'=>-13914,'se'=>-13910,'sen'=>-13907,'seng'=>-13906,'sha'=>-13905,'shai'=>-13896,'shan'=>-13894,'shang'=>-13878,'shao'=>-13870,'she'=>-13859,'shen'=>-13847,'sheng'=>-13831,'shi'=>-13658,'shou'=>-13611,'shu'=>-13601,'shua'=>-13406,'shuai'=>-13404,'shuan'=>-13400,'shuang'=>-13398,'shui'=>-13395,'shun'=>-13391,'shuo'=>-13387,'si'=>-13383,'song'=>-13367,'sou'=>-13359,'su'=>-13356,'suan'=>-13343,'sui'=>-13340,'sun'=>-13329,'suo'=>-13326, 'ta'=>-13318,'tai'=>-13147,'tan'=>-13138,'tang'=>-13120,'tao'=>-13107,'te'=>-13096,'teng'=>-13095,'ti'=>-13091,'tian'=>-13076,'tiao'=>-13068,'tie'=>-13063,'ting'=>-13060,'tong'=>-12888,'tou'=>-12875,'tu'=>-12871,'tuan'=>-12860,'tui'=>-12858,'tun'=>-12852,'tuo'=>-12849, 'wa'=>-12838,'wai'=>-12831,'wan'=>-12829,'wang'=>-12812,'wei'=>-12802,'wen'=>-12607,'weng'=>-12597,'wo'=>-12594,'wu'=>-12585, 'xi'=>-12556,'xia'=>-12359,'xian'=>-12346,'xiang'=>-12320,'xiao'=>-12300,'xie'=>-12120,'xin'=>-12099,'xing'=>-12089,'xiong'=>-12074,'xiu'=>-12067,'xu'=>-12058,'xuan'=>-12039,'xue'=>-11867,'xun'=>-11861, 'ya'=>-11847,'yan'=>-11831,'yang'=>-11798,'yao'=>-11781,'ye'=>-11604,'yi'=>-11589,'yin'=>-11536,'ying'=>-11358,'yo'=>-11340,'yong'=>-11339,'you'=>-11324,'yu'=>-11303,'yuan'=>-11097,'yue'=>-11077,'yun'=>-11067, 'za'=>-11055,'zai'=>-11052,'zan'=>-11045,'zang'=>-11041,'zao'=>-11038,'ze'=>-11024,'zei'=>-11020,'zen'=>-11019,'zeng'=>-11018,'zha'=>-11014,'zhai'=>-10838,'zhan'=>-10832,'zhang'=>-10815,'zhao'=>-10800,'zhe'=>-10790,'zhen'=>-10780,'zheng'=>-10764,'zhi'=>-10587,'zhong'=>-10544,'zhou'=>-10533,'zhu'=>-10519,'zhua'=>-10331,'zhuai'=>-10329,'zhuan'=>-10328,'zhuang'=>-10322,'zhui'=>-10315,'zhun'=>-10309,'zhuo'=>-10307,'zi'=>-10296,'zong'=>-10281,'zou'=>-10274,'zu'=>-10270,'zuan'=>-10262,'zui'=>-10260,'zun'=>-10256,'zuo'=>-10254 ); /** * 将中文编码成拼音 * @param string $utf8Data utf8字符集数据 * @param string $sRetFormat 返回格式 [head:首字母|all:全拼音] * @return string */ public static function encode($utf8Data, $sRetFormat='head'){ $sGBK = iconv('UTF-8', 'GBK', $utf8Data); $aBuf = array(); for ($i=0, $iLoop=strlen($sGBK); $i<$iLoop; $i++) { $iChr = ord($sGBK{$i}); if ($iChr>160) $iChr = ($iChr<<8) + ord($sGBK{++$i}) - 65536; if ('head' === $sRetFormat) $aBuf[] = substr(self::zh2py($iChr),0,1); else $aBuf[] = self::zh2py($iChr); } if ('head' === $sRetFormat) return implode('', $aBuf); else return implode(' ', $aBuf); } /** * 中文转换到拼音(每次处理一个字符) * @param number $iWORD 待处理字符双字节 * @return string 拼音 */ private static function zh2py($iWORD) { if($iWORD>0 && $iWORD<160 ) { return chr($iWORD); } elseif ($iWORD<-20319||$iWORD>-10247) { return ''; } else { foreach (self::$_aMaps as $py => $code) { if($code > $iWORD) break; $result = $py; } return $result; } } } ?>
2022年06月19日
289 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP身份证验证类
<?php /** *身份证号处理函数 */ /** * 功能:根据身份证号,自动返回生日 * @param stirng $IDCard 身份证号 * @return Ambigous <string, NULL> */ function getBrithday ($idCard) { if (strlen($idCard) == 18) { $birthday = substr($idCard, 6, 4) . '-' . substr($idCard, 10, 2) . '-' . substr($idCard, 12, 2); } elseif (strlen($idCard) == 15) { $birthday = "19" . substr($idCard, 6, 2) . '-' . substr($idCard, 8, 2) . '-' . substr($idCard, 10, 2); } else { $birthday = null; } return $birthday; } /** * 功能:根据身份证号,自动返回性别 * @param string $cid 身份证号 * @param number $comm 返回的性别类型 * @return string 男/女 1/0 */ function getSex ($cid, $comm = 0) { $cid = getIDCard($cid); $sexint = (int) substr($cid, 16, 1); if ($comm > 0) { return $sexint % 2 === 0 ? '女' : '男'; } else { return $sexint % 2 === 0 ? '0' : '1'; } } /** * 功能:把15位身份证转换成18位 * @param string $idCard * @return newid or id */ function getIDCard ($idCard) { // 若是15位,则转换成18位;否则直接返回ID if (15 == strlen($idCard)) { $w = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); $a = array("1","0","X","9","8","7","6","5","4","3","2"); $s = 0; $idCard18 = substr($idCard, 0, 6) . "19" . substr($idCard, 6); $idCard18_len = strlen($idCard18); for ($i = 0; $i < $idCard18_len; $i ++) { $s = $s + substr($idCard18, $i, 1) * $w[$i]; } return $idCard18.$a[$s % 11]; } else { return $idCard; } } /** * 根据身份证号返回年龄 * @param string $id 身份证号 * @return string|number */ function getAge($id){ //过了这年的生日才算多了1周岁 if(empty($id)) return ''; $date=strtotime(substr($id,6,8)); //获得出生年月日的时间戳 $today=strtotime('today'); //获得今日的时间戳 $diff=floor(($today-$date)/86400/365); //得到两个日期相差的大体年数 //strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比 $age=strtotime(substr($id,6,8).' +'.$diff.'years')>$today?($diff+1):$diff; return $age; }
2022年06月19日
418 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP提取网页的关键词
$meta = get_meta_tags('http://www.emoticode.net/'); $keywords = $meta['keywords']; // Split keywords $keywords = explode(',', $keywords ); // Trim them $keywords = array_map( 'trim', $keywords ); // Remove empty values $keywords = array_filter( $keywords ); print_r( $keywords );更多爬取方法可参考:QueryList
2022年06月19日
320 阅读
0 评论
0 点赞
1
...
10
11
12
...
14