在php中使用正则表达式

<?php
/**
 * php 正则表达式
 * 在php中想使用正则表达式,请先确认已经安装pcre扩展,可以输出phpinfo查看
 * author: mrluchanglong@163.com
 * 201709
 * */

/**
 * 一个正则表达式通常使用如下格式:
 * <delimiter><pattern><delimiter>[<modifiers>]
 * <定界符><匹配式><定界符>[修饰符(可选)]
 * 修饰符是可选的。界定符把正则式与修饰符分离开来。PCRE将正则表达式的第一个字符作为定界符。
 * 所以你应该使用一个不会出现在正则式本身中的字符。
 * 或者,你可以使用一个在表达式中存在的字符,但是你必须使用\对它进行转义.
 * 传统来说,字符/被用来当作定界符,但是你也可以选择其他常用的定界符,例如|或者@。
 * 从个人角度来说,大多数情况下,我们会选择@,除非我们需要匹配一个Email地址或者类似的包含@的正则式,那种情况下我们将用/。
 *
 * php函数preg_match()被用来匹配正则表达式。
 * 传递到函数的第一个参数式正则式。
 * 第二个参数是需要跟正则式匹配的字符串而且它也叫做标题。函数返回TRUE(正则式匹配)或者FALSE(正则式不匹配)。
 * 你还可以传递第三个参数————一个变量名。匹配的文本将通过引用存放到这个名字命名的数组中。如果不需要使用匹配的文本而只是想知道是否存在一个匹配,你可以不使用第三个参数并留空。
 */

//简而言之,格式如下,其中$matches是可选的:
$result=preg_match($pattern,$subject,$matches);




?>

 

仿linux权限 设置内容发布平台

以下仿照linux权限算法,对内容发布平台进行设置

 /**
     * 推送平台
     *
     * 值     显示
     * 0      全部
     * 1      web平台
     * 2      android平台
     * 4      iOS平台
     *
     * 3      web+android
     * 5      web+iOS
     * 6      android+iOS
     * 7      web+android+iOS
     *
     * 仿unix权限规则,平台码按等比数列形式增加,如 1,2,4,8,16,32....
     * 两种平台的状态码相加等于的值就表示这两种平台都显示,多个平台也一样
     *
     * @return array([],[]...)
     * */
    static function platForm()
    {
        return array(
            // 推送平台码 、文字
            ['code' => '0', 'text' => '全部'],
            ['code' => '1', 'text' => '网站'],
            ['code' => '2', 'text' => '安卓'],
            ['code' => '4', 'text' => '苹果']
        );
    }

    /**
     * 获取当前任务推送的平台
     * 为后台编辑提供
     * 状态码,根据保存的platfrom的值获取任务推送的平台
     * 如:传入7,返回 array(1,2,4),表示这个任务在1,2,4 平台开启推送
     * @code int 所有平台码:如0,1,2,3,4,5,6,7
     * @return array(1,2,4...)
     */
    static function getTaskPlatForm($code = 0)
    {
        $plat = [];
        if ($code > 0) {
            $platFrom = array_reverse(self::platForm());//从大到小开始取推送的平台
            foreach ($platFrom as $k => $v) {
                if ($v['code'] == 0) break;
                if ($code&$v['code'])$plat[] = (int)$v['code']; //使用按位与运算
            }
        } else {
            $plat = [0];
        }
        return $plat;
    }

    /**
     * 获取传入状态内的所有任务对应的platfrom的值
     * 为前台筛选提供
     * 如:传入2 返回 array(0,2,3,6,7),表示数据库中platfrom 为0,2,3,7,6的都允许显示
     * @param $code int 唯一平台码:如0,1,2,4
     * @return array(2,3,7...)
     * */
    static function inTaskPlatForm($code = 0)
    {
        $plat = [];
        if ($code>0) {
            $platFrom = self::platForm();
            $plat_code = [];
            foreach ($platFrom as $v) {
                $plat_code[] = $v['code'];
            }
            $sum = array_sum($plat_code);
            $plat = [];
            for ($i = $sum; $i >= 0; $i--) {
                if ($i & $code) $plat[] = $i;
            }
        }
        $plat[]=0;
        return $plat;
    }

 

Bootstrap的 DatePicker 日期范围选择

$(function(){
  
    //开始
   $('.startdatepicker').datepicker({
        format: "yyyy-mm-dd",
        todayBtn:'linked',
        clearBtn:true,
        language: 'cn',
        autoclose:true,
        todayHighlight:true,
        startDate:'0',
   }).on('changeDate',function (ev) {
       if (ev.date){
          $('.enddatepicker').datepicker('setStartDate',new Date(ev.date.valueOf()))
       }else{
          $('.enddatepicker').datepicker('setStartDate',0)
       }
   });
   //结束
    $('.enddatepicker').datepicker({
        format: "yyyy-mm-dd",
        todayBtn:'linked',
        clearBtn:true,
        language: 'cn',
        autoclose:true,
        todayHighlight:true,
        startDate:'0',
    }).on('changeDate',function (ev) {
        if(ev.date){
           $('.startdatepicker').datepicker('setEndDate', new Date(ev.date.valueOf()))
        }else {
           $('.startdatepicker').datepicker('setEndDate',null)
        }

    });

});

laravel js 引入

{!! Theme::asset()->container('specific-css')->usePath()->add('datepicker-css', 'plugins/ace/css/datepicker.css') !!}
{!! Theme::asset()->container('specific-js')->usePath()->add('datepicker-js', 'plugins/ace/js/date-time/bootstrap-datepicker.min.js') !!}

php 安装 composer

https://getcomposer.org/download/

命令行安装

 

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

出现错误

Failed to decode zlib stream
给composer-setup.php   添加everyone权限

执行成功

 

 

 

composer-setup安装

1.设置apache和php打开ssl

2.安装后将C:\ProgramData\ComposerSetup\bin添加到系统环境变量

 

 

微信对接常见问题

微信对接常见问题
一、微信支付

其中微信公众号支付,扫码支付在微信公众号管理后台申请配置,支付授权目录必须填写完整地址,例如PC微信扫码支付

http://www.xxxx.com/index.php/Home/Payent/ 微信公众号支付 http://ww.xx.com/index.php/Mobile/Payment/
而APP微信支付需要前往微信开放平台申请
APP微信支付的申请流程如下:
1, 注册开发者账号;
2, 认证开发者资质;
3, 创建APP并提交审核;
4, 提交资料申请微信支付;
5, 启动设计并开发;
6, 开户成功,并且进行验证;
7, 在线签署协议,并接入,即可完成接入。

二 微信登陆
微信公众号登陆只需要在微信公众号后台配置好获取用户信息的网页安全域名,网页安全域名、JS安全域名、业务域名如果是一级域名都需要带上WWW。
微信扫码登陆需要前去微信开发平台申请,创建应用获取APPID和AppSecret,并且要绑定微信公众号,否则扫码登陆与微信公众号登陆会产生两个账号,因为他们产生的 openid不一致,如果绑定了公众号,那么微信公众号获取用户信息里就会产生一个跟微信扫码登陆一样的unionid,这个时候通过这个unionid认证用户就可以解决同一个微信用户两边登陆产生两个平台账号的问题
微信扫码登陆所有参数配置正确时,可能点击微信快捷登陆,二维码依然出来不了,还报参数错误,这里可以看看发起微信扫码登陆的平台地址里如果是一级域名里是否有带WWW,没带WWW就会报错。

三 微信分享
附录1-JS-SDK使用权限签名算法
jsapi_ticket
生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
2.用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
成功返回如下JSON:
{
“errcode”:0,
“errmsg”:”ok”,
“ticket”:”bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA”,
“expires_in”:7200
}

调用config 接口的时候传入参数 debug: true 可以开启debug模式,页面会alert出错误信息。以下为常见错误及解决方法:
1.invalid url domain当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,仅支持80(http)和443(https)两个端口,因此不需要填写端口号(一个appid可以绑定三个有效域名,见 目录1.1.1)。
2.invalid signature签名错误。建议按如下顺序检查:
1.确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
2.确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
3.确认url是页面完整的url(请在当前页面alert(location.href.split(‘#’)[0])确认),包括’http(s)://’部分,以及’?’后面的GET参数部分,但不包括’#’hash后面的部分。
4.确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
5.确保一定缓存access_token和jsapi_ticket。
6.确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去’#’hash部分的链接(可用location.href.split(‘#’)[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。

php 冒泡排序

function bubbleSort($numbers) {
    $cnt = count($numbers);
    for ($i = 0; $i < $cnt; $i++) {
        for ($j = 0; $j < $cnt - $i - 1; $j++) {
            if ($numbers[$j] > $numbers[$j + 1]) {
                $temp = $numbers[$j];
                $numbers[$j] = $numbers[$j + 1];
                $numbers[$j + 1] = $temp;
            }
        }
    }
 
    return $numbers;
}
 
$num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 0);
var_dump(bubbleSort($num));
 
//输出结果如下:
//array(10) {
//  [0]=>
//  int(0)
//  [1]=>
//  int(10)
//  [2]=>
//  int(20)
//  [3]=>
//  int(30)
//  [4]=>
//  int(40)
//  [5]=>
//  int(50)
//  [6]=>
//  int(60)
//  [7]=>
//  int(70)
//  [8]=>
//  int(80)
//  [9]=>
//  int(90)
//}