├── .gitignore ├── composer.json ├── autoload.php ├── src ├── function │ ├── FilterValid.php │ └── Tools.php └── library │ └── Http.php ├── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | composer.lock 4 | /vendor 5 | /tests -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jjonline/php-helper", 3 | "description": "常用的函数和类", 4 | "keywords": ["function","class","library"], 5 | "homepage": "https://github.com/jjonline/php-helper", 6 | "type": "library", 7 | "authors": [ 8 | { 9 | "name": "Jea杨", 10 | "email": "jjonline@jjonline.cn", 11 | "homepage": "http://blog.jjonline.cn/" 12 | } 13 | ], 14 | "license": "GPL-3.0", 15 | "require": { 16 | "php": ">=5.4" 17 | }, 18 | "autoload": { 19 | "psr-4": { 20 | "jjonline\\library\\": "src/library", 21 | "jjonline\\helper\\": "src/function" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /autoload.php: -------------------------------------------------------------------------------- 1 | =$minLength && strlen($uid)<=$maxLength && ctype_digit((string)$uid); 79 | } 80 | 81 | /** 82 | * 检测传入的变量是否为一个合法的账户密码 83 | * --------- 84 | * 1、必须同时包含数字和字母 85 | * 2、通过第二个参数指定最小长度,默认值6 86 | * 3、通过第三个可选参数指定最大长度,默认值18 87 | * --------- 88 | * @param string $password 需要被判断的字符串 89 | * @param int $minLength 允许的账户密码最短位数 默认6 90 | * @param int $maxLength 允许的账户密码最长位数 默认16 91 | * @return boolean 92 | */ 93 | public static function is_password_valid($password, $minLength = 6, $maxLength = 18) 94 | { 95 | if(strlen($password) > $maxLength || strlen($password) < $minLength) 96 | { 97 | return false; 98 | } 99 | return preg_match('/\d{1,'.$maxLength.'}/',$password) === 1 && preg_match('/[a-zA-Z]{1,'.$maxLength.'}/',$password) === 1; 100 | } 101 | 102 | /** 103 | * 检查字符串是否是UTF8编码下的中文 104 | * @param string $string 字符串 105 | * @return boolean 106 | */ 107 | public static function is_chinese_valid($str) 108 | { 109 | return preg_match("/[\x{4e00}-\x{9fa5}]+/u", $str) === 1; 110 | } 111 | 112 | /** 113 | * 检查字符串是否是UTF8编码 114 | * @param string $string 字符串 115 | * @return boolean 116 | */ 117 | public static function is_utf8_valid($str) 118 | { 119 | $c = 0; 120 | $b = 0; 121 | $bits = 0; 122 | $len = strlen($str); 123 | for($i = 0; $i<$len; $i++) 124 | { 125 | $c = ord($str[$i]); 126 | if($c > 128){ 127 | if(($c >= 254)) return false; 128 | elseif($c >= 252) $bits=6; 129 | elseif($c >= 248) $bits=5; 130 | elseif($c >= 240) $bits=4; 131 | elseif($c >= 224) $bits=3; 132 | elseif($c >= 192) $bits=2; 133 | else return false; 134 | if(($i+$bits) > $len) return false; 135 | while($bits > 1){ 136 | $i++; 137 | $b = ord($str[$i]); 138 | if($b < 128 || $b > 191) return false; 139 | $bits--; 140 | } 141 | } 142 | } 143 | return true; 144 | } 145 | 146 | /** 147 | * 检测传入的变量是否为一个合法的天朝身份证号(15位、18位兼容) 148 | * @param mixed $citizen_id 149 | * @return false|[] 150 | */ 151 | public static function is_citizen_id_valid($citizen_id) 152 | { 153 | $id = strtoupper($citizen_id); 154 | if(!(preg_match('/^\d{17}(\d|X)$/',$id) || preg_match('/^\d{15}$/',$id))) 155 | { 156 | return false; 157 | } 158 | # 15位老号码转换为18位 159 | $Wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1); 160 | $Ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 161 | $cardNoSum = 0; 162 | if(strlen($id)==16) 163 | { 164 | $id = substr(0, 6).'19'.substr(6, 9); 165 | for($i = 0; $i < 17; $i++) { 166 | $cardNoSum += substr($id,$i,1) * $Wi[$i]; 167 | } 168 | $seq = $cardNoSum % 11; 169 | $id = $id.$Ai[$seq]; 170 | } 171 | # 效验18位身份证最后一位字符的合法性 172 | $cardNoSum = 0; 173 | $id17 = substr($id,0,17); 174 | $lastString = substr($id,17,1); 175 | for($i = 0; $i < 17; $i++) 176 | { 177 | $cardNoSum += substr($id,$i,1) * $Wi[$i]; 178 | } 179 | $seq = $cardNoSum % 11; 180 | $realString = $Ai[$seq]; 181 | # 最后一位效验失败 不是合法身份证号 182 | if($lastString != $realString) { 183 | return false; 184 | } 185 | # 地域仅能精确到省、自治区信息,再往下就需大量数据支撑才能精确 186 | $oProvice = array( 187 | 11 => "北京", 188 | 12 => "天津", 189 | 13 => "河北", 190 | 14 => "山西", 191 | 15 => "内蒙古", 192 | 21 => "辽宁", 193 | 22 => "吉林", 194 | 23 => "黑龙江", 195 | 31 => "上海", 196 | 32 => "江苏", 197 | 33 => "浙江", 198 | 34 => "安徽", 199 | 35 => "福建", 200 | 36 => "江西", 201 | 37 => "山东", 202 | 41 => "河南", 203 | 42 => "湖北 ", 204 | 43 => "湖南", 205 | 44 => "广东", 206 | 45 => "广西", 207 | 46 => "海南", 208 | 50 => "重庆", 209 | 51 => "四川", 210 | 52 => "贵州", 211 | 53 => "云南", 212 | 54 => "西藏", 213 | 61 => "陕西", 214 | 62 => "甘肃", 215 | 63 => "青海", 216 | 64 => "宁夏", 217 | 65 => "新疆", 218 | 71 => "台湾", 219 | 81 => "香港", 220 | 82 => "澳门", 221 | 91 => "国外" 222 | ); 223 | $Provice = substr($id, 0, 2); 224 | $BirthYear = substr($id, 6, 4); 225 | $BirthMonth = substr($id, 10, 2); 226 | $BirthDay = substr($id, 12, 2); 227 | $Sex = substr($id, 16,1) % 2 ;//男1 女0 228 | # 省份数据 229 | if(!isset($oProvice[$Provice])) 230 | { 231 | return false; 232 | } 233 | # 年份超限 234 | if($BirthYear > 2078 || $BirthYear < 1900) 235 | { 236 | return false; 237 | } 238 | # 年月日是否合法 239 | $RealDate = strtotime($BirthYear.'-'.$BirthMonth.'-'.$BirthDay); 240 | if(date('Y',$RealDate) != $BirthYear || date('m',$RealDate) != $BirthMonth || date('d',$RealDate) != $BirthDay) 241 | { 242 | return false; 243 | } 244 | # 效验成功 返回关联数组,便于从身份证号中提取基本信息 boolean判断为true 245 | return array('id'=>$id,'location'=>$oProvice[$Provice],'Y'=>$BirthYear,'m'=>$BirthMonth,'d'=>$BirthDay,'sex'=>$Sex); 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | jjonline/php-helper 2 | =================== 3 | 4 | [![Latest Stable Version](https://poser.pugx.org/jjonline/php-helper/v/stable)](https://packagist.org/packages/jjonline/php-helper) 5 | [![License](https://poser.pugx.org/jjonline/php-helper/license)](https://packagist.org/packages/jjonline/php-helper) 6 | [![Build Status](https://travis-ci.org/jjonline/php-helper.svg?branch=master)](https://travis-ci.org/jjonline/php-helper) 7 | 8 | jjonline/php-helper是日常开发过程中积累提炼而来,收集整理了基于静态类的多个常用函数方法和通用的对象类,PHP版本要求至少5.4,基于命名空间,适配composer,方便composer一键安装和管理。 9 | 10 | ## 安装 11 | 12 | 方法1、composer安装后使用composer的自动加载器 13 | 14 | `composer require jjonline/php-helper` 15 | 16 | 17 | 方法2、下载代码包后直接使用包提供的自动加载器 18 | 19 | `require_once './autoload.php';` 20 | 21 | > 强烈建议使用composer进行包管理和安装 22 | 23 | 24 | ## 文档 25 | 26 | 快速示例: 27 | ~~~ 28 | use jjonline\helper\FilterValid; 29 | use jjonline\helper\Tools; 30 | use jjonline\library\Http; 31 | 32 | // 表单效验 33 | $isMailValid = FilterValid::is_mail_valid('jjonline@jjonline.cn'); 34 | $isPhoneValid = FilterValid::is_phone_valid('13800138000'); 35 | 36 | // ... 37 | 38 | // 通用方法 39 | $isMobileBrowser = Tools::is_mobile_browser(); 40 | $status = Tools::rm_dir('./test'); 41 | 42 | // ... 43 | 44 | // 通用http操纵类Post方法 45 | $Http = Http::init(); 46 | $excuteStatus = $Http->setData('postField','postVallue') 47 | ->setTimeOut(10) 48 | ->setReferer('http://blog.jjonline.cn') 49 | ->setUserAgent('Mozilla/5.0') 50 | ->setRequestHeader('X-Powered-By','JJonline.Cn') 51 | ->setRequestCookie('cookieName','cookieValue') 52 | ->post('http://blog.jjonline.cn'); 53 | if($excuteStatus) 54 | { 55 | $Http->save('/var/www/index.html'); 56 | echo $Http->getBody(); 57 | } 58 | 59 | // 通用http操纵类Get方法 60 | $excuteStatus = $Http->reset()->get('http://blog.jjonline.cn'); 61 | if($excuteStatus) 62 | { 63 | $Http->save('/var/www/index1.html'); 64 | print_r($Http->getResponseCookie()); 65 | } 66 | ~~~ 67 | 68 | jjonline/php-helper包含两部分: 69 | 70 | * 静态类函数方法:`src/function`目录下 71 | * 对象类:`src/library`目录下 72 | 73 | ---- 74 | 75 | ### FilterValid 表单验证静态类 76 | 77 | 引入命名空间:`use jjonline\helper\FilterValid` 78 | 79 | + **`boolean FilterValid::is_mail_valid(string $str)`** 80 | 81 | 检测传入的字符串是否符合邮箱格式 82 | 83 | + **`boolean FilterValid::is_phone_valid(mixed $str|number)`** 84 | 85 | 检测传入的字符串或数字是否符合天朝手机号格式 86 | 87 | + **`boolean FilterValid::is_url_valid(string $url)`** 88 | 89 | 检测传入的字符串是否为http或http打头的网址,可包含端口号、get参数和锚点 90 | 91 | + **`boolean FilterValid::is_uid_valid(mixd $uid[[,$min_len = 4],$max_len = 11])`** 92 | 93 | 检测传入的数字是否为一个数字ID,第二个可选参数指定最小长度默认值4;第三个可选参数指定最大长度默认值11 94 | 95 | + **`boolean FilterValid::is_password_valid(string $pwd[,$min_len = 6,$max_len = 18])`** 96 | 97 | 检测传入的字符串是否为同时包含数字和字母的合法密码,第二个可选参数指定最小长度默认值4;第三个可选参数指定最大长度默认值18 98 | 99 | + **`boolean FilterValid::is_chinese_valid(string $str)`** 100 | 101 | 检测传入的字符串是否全部为中文汉字 102 | 103 | + **`boolean FilterValid::is_utf8_valid(string $str)`** 104 | 105 | 检测传入的字符串是否utf8编码 106 | 107 | + **`mixd[false|array] FilterValid::is_citizen_id_valid(string $citizen_id)`** 108 | 109 | 检测传入的字符串是否为合乎编码规范的天朝身份证号,兼容16位和18位,合乎规范返回从身份证号提取的出生年月、归属地、性别和身份证号组成的数组,否则返回false;注意传入16位老号码合乎规范的话返回数组中的身份证号将转换为18位! 110 | 111 | ### Tools 常用工具方法静态类 112 | 113 | 引入命名空间:`use jjonline\helper\Tools` 114 | 115 | + **`boolean Tools::is_weixin_browser([string $userAgent = null])`** 116 | 117 | 检测当前浏览器环境是否为微信浏览器,或者传入浏览器userAgent字符串检测是否为微信浏览器,参数可选 118 | 119 | + **`boolean Tools::is_mobile_browser()`** 120 | 121 | 检测当前浏览器环境是否为移动端浏览器,当然微信浏览器也会返回true 122 | 123 | + **`string Tools::hide_name(string $userName)`** 124 | 125 | 用户名脱敏处理,字符长度小于3返回3个\*,长度大于3则返回首尾各1个字符以及中间的3个\*号字符 126 | 127 | + **`string Tools::hide_ipv4(string $ip)`** 128 | 129 | IPv4地址脱敏处理,返回IPv4中间两位脱敏后的字符,例如:223.\*\*.\*\*.5 130 | 131 | + **`string Tools::nl2p(string $str)`** 132 | 133 | nl2br的类似函数,只不过是将换行符`\n`、`\r`或`\n\r`转换为成对的`p`标签 134 | 135 | + **`string Tools::time_ago(mixed $unixTimeStamp)`** 136 | 137 | 将Unix时间戳转换为`xx前`这种模糊表示法,例如:`刚刚`、`1分钟前`、`2小时前`、`3周前`、`1个月前(07-11)`、`3年前(2014-12-02)` 等 138 | 139 | + **`boolean Tools::is_ssl()`** 140 | 141 | 检测当前请求是否为https请求 142 | 143 | + **`mixed Tools::get_client_ip([$isLong = 0],[$isAdv = false])`** 144 | 145 | 获取客户端的IPv4地址,第一个可选参数1和true返回IPv4数字表示法,0和false返回IPv4字符串,默认值0;第二个可选参数是否检测http代理情况,false不检测,true检测,默认值false 146 | 147 | + **`void Tools::redirect(string $url[[,int $time = 0],$text = null])`** 148 | 149 | 网页重定向,也就是网页跳转啦!第一参数跳转的url,第二个可选参数跳转等待时间,第三个可选参数跳转等待时显示的文本 150 | 151 | + **`string|null Tools::dump(string $str[,$echo=true[, $label=null[, $strict=true]]])`** 152 | 153 | 开发时浏览器友好的调试输出任意变量,来源于ThinkPHP,一般调试输出仅需要将调试变量当做第一个参数 154 | >第二个可选参数为false将返回处理好的字符串,为true直接输出没有返回值,默认值为true; 155 | 156 | >第三个可选参数指定本次调试的标签,也就是在输出或返回值前加上这个标签值,便于开发调试,默认值null; 157 | 158 | >第四个可选参数指定本次输出是否严格模式,也就是在输出或返回值的时候是否将html标签转义,默认值true; 159 | 160 | 161 | + **`string Tools::transfer_encrypt(string $str[, $key = 'jjonline'[, $expiry = 0]])`** 162 | 163 | 来源于discuz的可逆加解密算法,用于有有效期效验的数据交换,加密强度很弱,请甄别使用场景 164 | >第二个可选参数:本次加密的秘钥,默认加了一个秘钥`jjonline` 165 | 166 | >第三个可选参数:本次加密的有效时间,单位秒,在该参数指定的时间内解密有效,默认值0表示永不失效 167 | 168 | + **string Tools::transfer_decrypt(string $str[, $key = 'jjonline'])`** 169 | 170 | 将transfer_encrypt加密的值解密,并效验有效期,成功返回原串,失败或失效返回空字符串 171 | >第一个参数:待解密的密文 172 | 173 | >第二个参数:解密的秘钥 174 | 175 | >返回值:已失效或解密失败返回空值,解密成功返回解密后明文 176 | 177 | **特别留意:超过过期时间有秘钥也是能解密出明文的,只不过方法体本身效验是否过期,过期就认为解密失败** 178 | 179 | + **`string Tools::mbsubstr(string $str [,$start = 0[, $length[, $charset = "utf-8"]]])`** 180 | 181 | 返回参数指定的参数截取字符串,参数与原生函数`mb_substr`一致,这是一个兼容处理函数 182 | 183 | + **`Tools::get_rand_string([$len = 6[, $type = ''[, $addChars = '']]])`** 184 | 185 | 获取随机字符串,来源于ThinkPHP 186 | >第一个**可选参数**指定返回字符串长度,默认值6 187 | 188 | >第二个**可选参数**指定返回字符串类型,取值空字符串、0字母、1数字、2大写字母、3小写字母、4中文,默认值空表示返回大小写字母和数字混合的随机字符串,0表示返回大小写字母混合的字符串,以此类推 189 | 190 | >第三个**可选参数**指定附加的用于返回值随机字符串的字符元素,函数中的数字、大小写字母去除了易混淆的字母oOLl和数字0和1,若不需要去除通过第三个参数附加进去即可,默认值空字符串 191 | 192 | + **`string Tools::clear_js_code(string $html)`** 193 | 194 | 去除字符串中的js代码,包括大段的由