欢迎光临鹤城钮言起网络有限公司司官网!
全国咨询热线:13122432650
当前位置: 首页 > 新闻动态

PHP preg_replace 实现电话号码标准化及前导零条件移除

时间:2025-11-30 04:40:38

PHP preg_replace 实现电话号码标准化及前导零条件移除
易于扩展: 当需要向User结构体添加新字段时,DB结构体无需修改即可自动获得这些新字段(如果它们是公共的)。
0 查看详情 值接收器和指针接收器 当使用指针接收器时,需要注意,如果接收者是可寻址的值,Go 会自动取地址。
if (p != nullptr) { /* 安全访问 */ } 引用一旦绑定就有效,但错误初始化会导致未定义行为 操作符与语法差异 使用指针需要显式解引用(*)来访问目标值,取地址用&。
// 我们需要手动读取并消耗掉这个最后的空白字符,以确保后续读取从二进制数据开始。
立即学习“C++免费学习笔记(深入)”; 定义左索引(0)和右索引(length - 1) 循环交换 str[left] 和 str[right],直到 left >= right 示例代码: string str = "world"; int left = 0, right = str.length() - 1; while (left < right) {   swap(str[left], str[right]);   left++;   right--; } // 结果:str 变为 "dlrow" 利用栈结构反转 利用栈“后进先出”的特性,逐个压入字符再弹出组成新字符串。
例如,一个线程操作vector A,另一个线程操作vector B,不会产生冲突。
No-Throw Guarantee: 保证操作不会抛出任何异常。
错误处理: 始终使用try...catch块来捕获潜在的蓝牙操作错误。
"; std::regex date_regex("(\d{4})年(\d{2})月(\d{2})日"); // 匹配日期,并捕获年、月、日 std::smatch results; // 存储匹配结果 if (std::regex_search(text, results, date_regex)) { std::cout << "找到日期: " << results[0] << std::endl; // 整个匹配到的字符串 std::cout << "年份: " << results[1] << std::endl; // 第一个捕获组:年份 std::cout << "月份: " << results[2] << std::endl; // 第二个捕获组:月份 std::cout << "日期: " << results[3] << std::endl; // 第三个捕获组:日期 } // 如果需要查找所有匹配项,可以使用循环 std::string multiple_dates = "2023-10-27, 2024-01-15"; std::regex dash_date_regex("(\d{4})-(\d{2})-(\d{2})"); auto words_begin = std::sregex_iterator(multiple_dates.begin(), multiple_dates.end(), dash_date_regex); auto words_end = std::sregex_iterator(); std::cout << "找到所有日期: "; for (std::sregex_iterator i = words_begin; i != words_end; ++i) { std::smatch match = *i; std::cout << " " << match.str() << " (年:" << match[1] << ", 月:" << match[2] << ", 日:" << match[3] << ") "; } std::regex_replace: 用于将字符串中所有匹配正则表达式的部分替换为另一个字符串。
合理使用noexcept能提升程序性能并增强异常安全性,特别是在编写可移动类型和泛型代码时尤为重要。
") // 生产环境请务必从环境变量或配置中读取 // Login 模拟用户登录,成功后生成JWT func Login(w http.ResponseWriter, r *http.Request) { // 这里省略了实际的用户名密码验证逻辑 username := "testuser" // 假设验证成功,获取到用户名 // 设置Token的过期时间,比如1小时 expirationTime := time.Now().Add(1 * time.Hour) claims := &MyClaims{ Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expirationTime), IssuedAt: jwt.NewNumericDate(time.Now()), Subject: username, }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenString, err := token.SignedString(jwtSecret) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "生成Token失败: %v", err) return } // 将Token返回给客户端 fmt.Fprintf(w, `{"token": "%s"}`, tokenString) } // AuthMiddleware 是一个JWT认证中间件 func AuthMiddleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { tokenString := r.Header.Get("Authorization") if tokenString == "" { w.WriteHeader(http.StatusUnauthorized) fmt.Fprint(w, "未提供认证Token") return } // 移除"Bearer "前缀 if len(tokenString) > 7 && tokenString[:7] == "Bearer " { tokenString = tokenString[7:] } else { w.WriteHeader(http.StatusUnauthorized) fmt.Fprint(w, "Token格式错误,应为 'Bearer <token>'") return } claims := &MyClaims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { // 验证签名方法是否是我们预期的HS256 if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("非法的签名方法: %v", token.Header["alg"]) } return jwtSecret, nil }) if err != nil { if err == jwt.ErrSignatureInvalid { w.WriteHeader(http.StatusUnauthorized) fmt.Fprint(w, "Token签名无效") return } // 检查Token是否过期 if ve, ok := err.(*jwt.ValidationError); ok { if ve.Errors&jwt.ValidationErrorExpired != 0 { w.WriteHeader(http.StatusUnauthorized) fmt.Fprint(w, "Token已过期") return } } w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "解析Token失败: %v", err) return } if !token.Valid { w.WriteHeader(http.StatusUnauthorized) fmt.Fprint(w, "Token无效") return } // 如果Token有效,可以将用户信息存储在请求上下文中,供后续Handler使用 // r = r.WithContext(context.WithValue(r.Context(), "username", claims.Username)) fmt.Printf("用户 %s 认证成功\n", claims.Username) next.ServeHTTP(w, r) } } // ProtectedHandler 只有认证通过的用户才能访问 func ProtectedHandler(w http.ResponseWriter, r *http.Request) { // username := r.Context().Value("username").(string) // 从上下文中获取用户信息 fmt.Fprint(w, "恭喜,你已成功访问受保护的资源!
Go的http.Client默认自动跟随重定向,最多10次;可通过自定义CheckRedirect函数禁用或控制重定向行为,如返回http.ErrUseLastResponse禁止、限制次数或拦截特定域名,via参数记录请求链,精细管理跳转逻辑。
总结 通过 PyInstaller 打包 Python 程序时,管理非脚本文件依赖的关键在于理解可执行文件的文件查找机制。
根据数组类型选择合适的方式:优先使用 std::array 或 std::vector 配合 std::swap;传统数组则手动循环交换;大数组可考虑指针交换优化性能。
强大的语音识别、AR翻译功能。
当通道被关闭且所有已发送的值都被接收后,循环会自动结束。
友元函数不是类的成员函数,但它被授予了访问类中所有成员(包括 private 和 protected 成员)的权限。
合理组合多种策略,才能真正提升数据库防护能力。
end='' 是至关重要的!
然而,对于私有的Subversion(SVN)仓库,情况则有所不同。

本文链接:http://www.asphillseesit.com/220023_4845ce.html