本文详解一个适用于php的正则表达式,用于匹配以字母或数字为核心、支持首尾可选下划线(_)或连字符(-)、且禁止连续两个相同分隔符(如 `__` 或 `--`)的字符串,兼容示例如 `_test147`、`test-test_` 等。
在 PHP 中实现严格但灵活的标识符校验(如用户名、变量名、URL 片段等)时,常需满足以下业务约束:
可选的 _ 或 -; ✅ 推荐正则表达式(兼顾可读性与兼容性):
/^[-_]?[a-z\d]+(?:[_-][a-z\d]+)*[-_]?$/i
| 部分 | 含义 |
|---|---|
| ^ | 字符串起始锚点 |
| [-_]? | 可选开头分隔符:一个 _ 或 -(仅限 0 或 1 次) |
| [a-z\d]+ | 必需:至少一个字母或数字(+ 保证非空核心) |
| (?:[_-][a-z\d]+)* |
可重复的“分隔符+字母数字”单元: (?:...) 非捕获组提升性能; [_-] 匹配单个 _ 或 -; [a-z\d]+ 紧跟至少一个字母数字(杜绝 __ 或 -a- 类非法中断); * 表示该结构可出现 0 次或多次(支持 a_b_c) |
| [-_]? | 可选结尾分隔符(同开头) |
| $ | 字符串结束锚点 |
| /i | 忽略大小写修饰符(PHP 中推荐写法,比 [a-zA-Z] 更简洁) |
$patterns = [
'_test147', // ✅ 开头下划线
'test', // ✅ 纯字母数字
'_a', // ✅ 最短合法:_ + 单字母
'test_test', // ✅ 中间下划线
'test-test_', // ✅ 中间连字符 + 结尾下划线
'a-b_c', // ✅ 混合分隔符(合法,因被字母数字隔开)
];
foreach ($patterns as $str) {
var_dump((bool) preg_match('/^[-_]?[a-z\d]+(?:[_-][a-z\d]+)*[-_]?$/i', $str));
}
// 输出:全部为 true若处理海量数据且需极致性能,可启用占有量词(possessive quantifier),避免回溯:
/^[-_]?[a-z\d]++(?:[_-][a-z\d]+)*[-_]?+$/i
其中 [a-z\d]++ 表示“尽可能多匹配且绝不回退”,配合整体结构可显著提升对抗恶意输入(如超长嵌套符号)的鲁棒性。
该正则精准覆盖需求场景:以字母数字为骨架,分隔符仅为连接器,首尾可装饰,中间不粘连。在 PHP 中直接使用 preg_match() 即可集成,建议始终添加 i 修饰符并配合 ^...$ 全匹配锚点,确保零误判。实际部署前,请结合 filter_var($input, FILTER_SANITIZE_STRING) 等预处理进一步保障安全性。
# php
# 正则表达式
# 编码
# filter_var
# 标识符
# 字符串
# input
# 性能优化
# 下划线
# 分隔符
# 可选
# 修饰符
# 多个
# 适用于
# 仅为
# 各有
# 而非
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置任务栏透明_Windows11使用工具美化任务栏
c++如何连接Redis c++ hiredis库使用教程【指南】
Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理
Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】
php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】
Windows11怎么用“记事本”自动换行与编码 Windows11记事本启用自动换行选择UTF-8编码避免乱码兼容多语言【教程】
如何在Golang中捕获JSON序列化错误_Golangjson.Marshal错误处理示例
Python类装饰器使用_元编程解析【教程】
Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】
c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】
c++如何使用std::bind绑定函数参数_c++ 占位符std::placeholders使用【详解】
Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度
如何在 Go 开发中正确处理本地包导入与远程模块路径的一致性问题
网站体验不好=浪费钱:如何提升-用户体验效果差
Win11怎么硬盘分区 Win11新建磁盘分区详细教程【步骤】
php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】
c++中如何对数组进行排序_c++数组排序算法汇总
如何在 Laravel 中通过嵌套关联关系进行 orderBy 排序
Go语言中正确反序列化多个同级XML元素为结构体切片的方法
如何在Golang中修改数组元素_通过指针实现原地更新
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
Windows10如何更改桌面背景_Win10个性化幻灯片放映设置
使用类变量定义字符串常量时的类型安全最佳实践
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
c++ nullptr与NULL区别_c++11空指针规范
Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】
用Python构建微服务架构实践_FastAPI与Django对比详解
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程
How to Properly Use NumPy in VS Code
Win11快速助手怎么用_Win11远程协助连接教程【工具】
如何在网页无标准表格标签时高效提取结构化数据
Windows10如何更改日期格式_Win10区域设置短日期修改
Win11怎么设置应用分屏_Windows11贴靠布局Snap Layouts
Mac上的iMovie如何剪辑视频?(新手入门教程)
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
php报错怎么查看_定位PHP致命错误与警告的方法【教程】
如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法
Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】
Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】
如何使用正则表达式提取以编号开头、后跟多个注解的完整代码块
如何在 Go 后端安全获取并验证前端存储的 JWT?
如何在Golang中验证模块完整性_Golanggo.sum校验与安全实践
如何使用 Selenium 正确获取篮球参考网站球员名单元素列表
c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】
Python多线程使用规范_线程安全解析【教程】
2026-01-02
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。