<?php
echo "wordpress版本 6.0+ PHP版本7.0~8.0";
echo "记名发售,一份一域名,不得分享转让及二开。";
echo "1、新增QQ号登录方式";
echo "2、私人朋友圈排版";
echo "3、持续更新个人信息流样式(微信朋友圈、抖音、快手、小红书等)";
echo "4、支持暗黑、明亮模式";
echo "5、可在前端发布图文";
echo "6、集成 io Code Highlight 插件(代码高亮插件、支持经典编辑器、古腾堡扩展)";
echo "7、新增个人专属网易云音乐页面、音乐播放器(APlayer)";
echo "8、pjax无刷新体验";
echo "9、强大的后台设置";
echo "10、丰富的自定义页面";
/** --------------------  **/









if (!function_exists('ckStr2ckArr')) {
    function ckStr2ckArr($cookieValue,$key='')
    {
        if(empty($cookieValue)) return [];
        // 第一步:将 cookie 字符串拆分为键值对数组
        $cookiePairs = explode(';', $cookieValue);
        // 创建一个关联数组来存储键值对
        $cookieArray = [];
        foreach ($cookiePairs as $pair) {
            $pair = trim($pair); // 去除多余的空格
            if ($pair) {
                list($k, $value) = explode('=', $pair, 2);
                $cookieArray[$k] = $value;
            }
        }
        //取指定的key值
        if(!empty($key)) return $cookieArray[$key];
        //取所有数组
        return $cookieArray;
    }
}
$str = 'cna=Z10vHxyLLhkCAXPgqFaTMN9A; t=0dfd9e12691b5e686d8e406981bc179f; cookie2=113f243906b3776465e8fc246291d43d; xlly_s=1; _samesite_flag_=true; _tb_token_=548dd75bd1b39; unb=2209368547703; _hvn_lgc_=77; mtop_partitioned_detect=1; _m_h5_tk=518ab9b7ade30d1634c92f423962eb36_1729138819303; _m_h5_tk_enc=548aa63b41127caaeb4e9bc65e796a49; sdkSilent=1729216940928; sgcookie=E100MANykuWklerydA%2BMl9VIKBDu93fi6%2FAkc52GgwunEqZm9s%2F4QR3w70efJdK0OjoqaSSsURjd8rmp0UbOxRuxqtfyCuinoz28cswnbcjUUfk%3D; csg=96db0be1; havana_lgc2_77=eyJoaWQiOjIyMDkzNjg1NDc3MDMsInNnIjoiM2I1OTA0MDEzYTljZTcwZTRkZDkwYTQ1YzkzYjgxYzEiLCJzaXRlIjo3NywidG9rZW4iOiIxcEprcmNFY3FXa3l3U1RnY2hhT1U0dyJ9; havana_lgc_exp=1731722711974; isg=BHd3EOiN3F5lmFlq1jMGY7UyBm3BPEuetKiDGckl5cateJK60QzK7iOTWtgmkCMW; tfstk=gtErVp23SDVj2CSshxnEQC-n2_n-D0f1tkGIKJ2nFbcoAahntJFxdHw3VWPU_7-7OJf8TklmM2aWVWNeT7NjZ3wSNSl31SZI-6n7gSa0k_C-O8MUGr4Aw_EUpHk3KWB-OTQbe8nKx11_YGw8eWEySDXjrIXnLv1_7crXm8nKx19XxNsae50nOCBExtomdYJox2cl3jDsi3DHqvAc3vhmx30nrqAmevkk-vV3ntkKiXDL382H0AglCB0NDGfWA4cgEj-HbdHrrewWRh-a0Yuzx8cVL9rqU4lilG5xelygElHUvOYETzzuNxFFbso0gy2nuo1kfXaaCk3Uq9pS9zMtqYPhjFG0u-q-5-pPI-ija-DTu1--VRz0VqEGG3FUC7rE57scEWnoKW3TA1K-ZJ2TXPiNYFogg-qt-kCvvXabKko8sst492jrHBHmRXqLzBYnrxHq1tW4O4UiIC35k2YpJqmt3f6SFeLKrWMq1TgBJe3mtxl1Fw5..';
//转换数组
$arr = ckStr2ckArr($newStr);
dump($arr);
//取数组中某一个值
$arr = ckStr2ckArr($newStr,'cookie2');
dump($arr);die;
                
                
        
        
                if (!function_exists('ckStrReplace')) {
    function ckStrReplace($cookieValue,$replacements)
    {
        if(empty($cookieValue)) return '';
        if(empty($replacements) || !is_array($replacements)) return '';
        // 第一步:将 cookie 字符串拆分为键值对数组
        $cookiePairs = explode(';', $cookieValue);
        // 创建一个关联数组来存储键值对
        $cookieArray = [];
        foreach ($cookiePairs as $pair) {
            $pair = trim($pair); // 去除多余的空格
            if ($pair) {
                list($key, $value) = explode('=', $pair, 2);
                $cookieArray[$key] = $value;
            }
        }
        // 第二步:根据 replacements 数组更新或者添加相应的值
        foreach ($replacements as $key => $newValue) {
            // 如果数组中有这个键,进行替换
            $cookieArray[$key] = $newValue;
        }
        // 第三步:重新组装成 cookie 字符串
        $newCookieValue = '';
        foreach ($cookieArray as $key => $value) {
            $newCookieValue .= $key . '=' . $value . '; ';
        }
        // 去掉最后的多余分号和空格
        return rtrim($newCookieValue, '; ');
    }
}
$str = 'cna=Z10vHxyLLhkCAXPgqFaTMN9A; t=0dfd9e12691b5e686d8e406981bc179f; cookie2=113f243906b3776465e8fc246291d43d; xlly_s=1; _samesite_flag_=true; _tb_token_=548dd75bd1b39; unb=2209368547703; _hvn_lgc_=77; mtop_partitioned_detect=1; _m_h5_tk=518ab9b7ade30d1634c92f423962eb36_1729138819303; _m_h5_tk_enc=548aa63b41127caaeb4e9bc65e796a49; sdkSilent=1729216940928; sgcookie=E100MANykuWklerydA%2BMl9VIKBDu93fi6%2FAkc52GgwunEqZm9s%2F4QR3w70efJdK0OjoqaSSsURjd8rmp0UbOxRuxqtfyCuinoz28cswnbcjUUfk%3D; csg=96db0be1; havana_lgc2_77=eyJoaWQiOjIyMDkzNjg1NDc3MDMsInNnIjoiM2I1OTA0MDEzYTljZTcwZTRkZDkwYTQ1YzkzYjgxYzEiLCJzaXRlIjo3NywidG9rZW4iOiIxcEprcmNFY3FXa3l3U1RnY2hhT1U0dyJ9; havana_lgc_exp=1731722711974; isg=BHd3EOiN3F5lmFlq1jMGY7UyBm3BPEuetKiDGckl5cateJK60QzK7iOTWtgmkCMW; tfstk=gtErVp23SDVj2CSshxnEQC-n2_n-D0f1tkGIKJ2nFbcoAahntJFxdHw3VWPU_7-7OJf8TklmM2aWVWNeT7NjZ3wSNSl31SZI-6n7gSa0k_C-O8MUGr4Aw_EUpHk3KWB-OTQbe8nKx11_YGw8eWEySDXjrIXnLv1_7crXm8nKx19XxNsae50nOCBExtomdYJox2cl3jDsi3DHqvAc3vhmx30nrqAmevkk-vV3ntkKiXDL382H0AglCB0NDGfWA4cgEj-HbdHrrewWRh-a0Yuzx8cVL9rqU4lilG5xelygElHUvOYETzzuNxFFbso0gy2nuo1kfXaaCk3Uq9pS9zMtqYPhjFG0u-q-5-pPI-ija-DTu1--VRz0VqEGG3FUC7rE57scEWnoKW3TA1K-ZJ2TXPiNYFogg-qt-kCvvXabKko8sst492jrHBHmRXqLzBYnrxHq1tW4O4UiIC35k2YpJqmt3f6SFeLKrWMq1TgBJe3mtxl1Fw5..';
        dump($str);
        $newStr = ckStrReplace($str,[
            'unb' => '测试',
            'cookie2' => '测试2',
            'x5sec' => 'test2'
        ]);
        dump($newStr);
                
                
        
        
                <?php
// 示例 Cookie 字符串
$cookieString = "user=hankin;age=30;city=hanzhou";
// 将字符串解析为数组
parse_str($cookieString, $cookieArray);
// 打印解析后的数组
print_r($cookieArray);
// 替换特定键的值
$cookieArray['city'] = 'shanghai';
$cookieArray['age'] = '35';
// 打印替换后的数组
print_r($cookieArray);
// 将数组重新组装为字符串
$newCookieString = http_build_query($cookieArray, '', ';');
// 打印重新组装后的字符串
echo $newCookieString;
?>
                
                
        
        
                <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
<script>
  // VConsole 默认会挂载到 `window.VConsole` 上
  var vConsole = new window.VConsole();
</script>
1.安装
npm install vconsole 或 cnpm install vconsole  
2.引入
import VConsole from 'vconsole'; 
const vConsole = new VConsole();
// 接下来即可照常使用 `console` 等方法
console.log('Hello world');
3.区分线上线下环境  
if (isDebug) {
  new VConsole();
}
4.结束调试后,可移除掉
vConsole.destroy();
demo地址:http://wechatfe.github.io/vconsole/demo.html
<script src="//cdn.bootcss.com/eruda/1.5.2/eruda.min.js"></script>
<script>eruda.init();</script>
                
                
        
        
                 <!--赞助商-->
    <div class="form-group row">
        <!--        <label class="control-label col-xs-12 col-sm-2">{:__('仪器产品')}:</label>-->
        <div class="col-xs-12">
            <table class="table fieldlist" data-template="eventtpl" data-name="row[yiqi_images]" id="second-table">
                <tr>
                    <td>{:__('赞助厂家')}</td>
                    <td>{:__('标题')}</td>
                    <td>{:__('图片')}<span style="color: red">670*176</span></td>
                    <td>{:__('链接')}</td>
                    <td>{:__('类型')}<span style="color: red">1内部;2外部</span></td>
                    <td width="100"></td>
                </tr>
                <tr>
                    <td colspan="3"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
                </tr>
            </table>
            <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
            <textarea name="row[yiqi_images]" class="form-control" style="display: none;"></textarea>
            <script id="eventtpl" type="text/html">
                <tr class="form-inline">
                    <td><input type="text" style="width: 200px;" name="<%=name%>[<%=index%>][id]" class="form-control selectpage" data-params='{"custom[status]":1}' data-source="manystore/shop" data-field="name" value="<%=row.id%>" placeholder="请选择赞助厂家"/></td>
                    <td><input type="text" name="<%=name%>[<%=index%>][title]" class="form-control" value="<%=row.title%>" placeholder="标题" size="10"/></td>
                    <td>
                        <input type="hidden" name="<%=name%>[<%=index%>][image]" id="c-image-<%=index%>" value="<%=row.image%>">
                        <!--@formatter:off-->
                        <button type="button" id="faupload-image" class="btn btn-danger faupload upload-image" data-input-id="c-image-<%=index%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false"></button>
                        <!--@formatter:on-->
                    </td>
                    <td><input type="text" name="<%=name%>[<%=index%>][url]" class="form-control" value="<%=row.url%>" placeholder="跳转链接" size="10"/></td>
                    <td><input type="text" name="<%=name%>[<%=index%>][type]" class="form-control" value="<%=row.type%>" placeholder="填1内部,2外部" size="10"/></td>
                    <td>
                        <!--下面的两个按钮务必保留-->
                        <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
                        <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
                    </td>
                </tr>
            </script>
        </div>
    </div>
    <div class="form-group row">
        <div class="col-xs-12">
            <table class="table fieldlist" data-template="eventtpl" data-name="row[yiqi_images]" id="second-table">
                <tr>
                    <td>{:__('赞助厂家')}</td>
                    <td>{:__('标题')}</td>
                    <td>{:__('图片')}<span style="color: red">670*176</span></td>
                    <td>{:__('链接')}</td>
                    <td>{:__('类型')}<span style="color: red">1内部;2外部</span></td>
                    <td width="100"></td>
                </tr>
                <tr>
                    <td colspan="3"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
                </tr>
            </table>
            <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
            <textarea name="row[yiqi_images]" class="form-control" style="display: none;">{$row.yiqi_images|htmlentities}</textarea>
            <script id="eventtpl" type="text/html">
                <tr class="form-inline">
                    <td><input type="text" style="width: 150px;" name="<%=name%>[<%=index%>][id]" class="form-control selectpage" data-params='{"custom[status]":1}' data-source="manystore/shop" data-field="name" value="<%=row.id%>" placeholder="请选择赞助厂家"/></td>
                    <td><input type="text" style="width: 100px;" name="<%=name%>[<%=index%>][title]" class="form-control" value="<%=row.title%>"/></td>
                    <td>
                        <input type="hidden" style="width: 100px;" name="<%=name%>[<%=index%>][image]" id="c-image-<%=index%>" value="<%=row.image%>">
                        <button type="button" id="faupload-image" class="btn btn-danger faupload upload-image" data-input-id="c-image-<%=index%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" <%if(row.image){%>style="background-image: url('<%=Fast.api.cdnurl(row.image)%>')"<%}%>></button>
                    </td>
                    <td><input type="text" name="<%=name%>[<%=index%>][url]" class="form-control" value="<%=row.url%>"/></td>
                    <td><input type="text" style="width: 80px;" name="<%=name%>[<%=index%>][type]" class="form-control" value="<%=row.type%>"/></td>
                    <td>
                        <!--下面的两个按钮务必保留-->
                        <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
                        <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
                    </td>
                </tr>
            </script>
        </div>
    </div>
        add: function () {
            $(document).on("fa.event.appendfieldlist", "#second-table .btn-append", function (e, obj) {
                //绑定动态下拉组件
                Form.events.selectpage(obj);
                //绑定日期组件
                Form.events.datetimepicker(obj);
                //绑定上传组件
                Form.events.faupload(obj);
                //上传成功回调事件,变更按钮的背景
                $(".upload-image", obj).data("upload-success", function (data) {
                    $(this).css("background-image", "url('" + Fast.api.cdnurl(data.url) + "')");
                })
            });
            Controller.api.bindevent();
        },
        edit: function () {
            Template.helper("Fast", Fast);
            $(document).on("fa.event.appendfieldlist", "#second-table .btn-append", function (e, obj) {
                //绑定动态下拉组件
                Form.events.selectpage(obj);
                //绑定日期组件
                Form.events.datetimepicker(obj);
                //绑定上传组件
                Form.events.faupload(obj);
                //上传成功回调事件,变更按钮的背景
                $(".upload-image", obj).data("upload-success", function (data) {
                    $(this).css("background-image", "url('" + Fast.api.cdnurl(data.url) + "')");
                })
            });
            Controller.api.bindevent();
        },
                
                
        
        
                import (
    "fmt"
    "github.com/duke-git/lancet/v2/validator"
)
func main() {
    result1 := validator.ContainChinese("你好")
    result2 := validator.ContainChinese("你好hello")
    result3 := validator.ContainChinese("hello")
    fmt.Println(result1)
    fmt.Println(result2)
    fmt.Println(result3)
    // Output:
    // true
    // true
    // false
}
IsChineseMobile 验证字符串是否是中国手机号码。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/validator"
)
func main() {
    result1 := validator.IsChineseMobile("13263527980")
    result2 := validator.IsChineseMobile("434324324")
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
IsChineseIdNum 验证字符串是否是中国身份证号码。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/validator"
)
func main() {
    result1 := validator.IsChineseIdNum("210911192105130715")
    result2 := validator.IsChineseIdNum("123456")
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
IsChinesePhone 验证字符串是否是中国电话座机号码。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/validator"
)
func main() {
    result1 := validator.IsChinesePhone("010-32116675")
    result2 := validator.IsChinesePhone("123-87562")
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
IsCreditCard 验证字符串是否是信用卡号码。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/validator"
)
func main() {
    result1 := validator.IsCreditCard("4111111111111111")
    result2 := validator.IsCreditCard("123456")
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
IsEmail 验证字符串是否是有效电子邮件地址。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/validator"
)
func main() {
    result1 := validator.IsEmail("abc@xyz.com")
    result2 := validator.IsEmail("a.b@@com")
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
Contain 判断 slice 是否包含 value。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/slice"
)
func main() {
    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
    result2 := slice.Contain([]int{1, 2, 3}, 4)
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
Chunk 按照 size 参数均分 slice。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/slice"
)
func main() {
    arr := []string{"a", "b", "c", "d", "e"}
    result1 := slice.Chunk(arr, 1)
    result2 := slice.Chunk(arr, 2)
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // [[a] [b] [c] [d] [e]]
    // [[a b] [c d] [e]]
}
Equal 检查两个切片是否相等,相等条件:切片长度相同,元素顺序和值都相同。
import (
    "fmt"
    "github.com/duke-git/lancet/v2/slice"
)
func main() {
    s1 := []int{1, 2, 3}
    s2 := []int{1, 2, 3}
    s3 := []int{1, 3, 2}
    result1 := slice.Equal(s1, s2)
    result2 := slice.Equal(s1, s3)
    fmt.Println(result1)
    fmt.Println(result2)
    // Output:
    // true
    // false
}
Comma 用逗号每隔3位分割数字/字符串,支持前缀添加符号。参数 value 必须是数字或者可以转为数字的字符串, 否则返回空字符串。
package main
import (
    "fmt"
    "github.com/duke-git/lancet/v2/formatter"
)
func main() {
    result1 := formatter.Comma("123", "")
    result2 := formatter.Comma("12345", "$")
    result3 := formatter.Comma(1234567, "¥")
    fmt.Println(result1)
    fmt.Println(result2)
    fmt.Println(result3)
    // Output:
    // 123
    // $12,345
    // ¥1,234,567
}
ForEach 对 map 中的每对 key和 value 执行 iteratee 函数。
package main
import (
    "fmt"
    "github.com/duke-git/lancet/v2/maputil"
)
func main() {
    m := map[string]int{
        "a": 1,
        "b": 2,
        "c": 3,
        "d": 4,
    }
    var sum int
    maputil.ForEach(m, func(_ string, value int) {
        sum += value
    })
    fmt.Println(sum)
    // Output:
    // 10
}
Keys 返回 map 中所有 key 的切片。
package main
import (
    "fmt"
    "github.com/duke-git/lancet/v2/maputil"
)
func main() {
    m := map[int]string{
        1: "a",
        2: "a",
        3: "b",
        4: "c",
        5: "d",
    }
    keys := maputil.Keys(m)
    sort.Ints(keys)
    fmt.Println(keys)
    // Output:
    // [1 2 3 4 5]
}
Merge 合并多个 maps 相同的 key 会被后来的 key 覆盖。
package main
import (
    "fmt"
    "github.com/duke-git/lancet/v2/maputil"
)
func main() {
    m1 := map[int]string{
        1: "a",
        2: "b",
    }
    m2 := map[int]string{
        1: "1",
        3: "2",
    }
    result := maputil.Merge(m1, m2)
    fmt.Println(result)
    // Output:
    // map[1:c 2:b 3:d]
}
RandInt 生成随机int, 范围[min, max)。
package main
import (
    "fmt"
    "github.com/duke-git/lancet/v2/random"
)
func main() {
    rInt := random.RandInt(1, 10)
    fmt.Println(rInt)
}
RandString 生成给定长度的随机字符串,只包含字母(a-zA-Z)。
package main
import (
    "fmt"
    "github.com/duke-git/lancet/v2/random"
)
func main() {
    randStr := random.RandString(6)
    fmt.Println(randStr) //pGWsze
}
以上这些只是部分的工具函数,如果想查看所有内容可以访问 https://www.golancet.cn/ 该网站。
再强大的函数工具库也不可能涵盖所有的场景,随着现在 AI 的盛行,AI 的编程辅助工具也应运而生。在这里我再分享一个免费的 PHP 代码直接转换 Go 代码工具,这个工具简直是 PHP 程序员的福音,直接将 PHP 代码贴上便自动生成了 Go 代码。
/usr/local/bin):
https://googlechromelabs.github.io/chrome-for-testing/ (各个版本的下载地址) 
   wget https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zip
   unzip chromedriver_linux64.zip -d /usr/local/bin/
5. 启动 ChromeDriver 服务:
   LANGUAGE=ZH-CN.UTF-8 /usr/local/bin/chromedriver --port=9515
6.成功运行后,您应该会看到类似以下输出:
Starting ChromeDriver {version} on port 9515...
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
https://github.com/php-webdriver/php-webdriver
PHP+WebDriver使用教程
https://github.com/php-webdriver/php-webdriver
php代码执行
<?php
require_once('vendor/autoload.php');
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
$options = new ChromeOptions();
$options->addArguments(['--no-sandbox','--headless']);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$host = 'http://localhost:9555';
$driver = RemoteWebDriver::create($host, $capabilities);
// 访问百度网站
$driver->get('https://www.baidu.com');
// 获取页面源代码
$pageSource = $driver->getPageSource();
echo $pageSource;
// 关闭 WebDriver 会话
$driver->quit();