正则表达式:匹配允许首尾可选下划线或连字符、中间不重复分隔符的字母数字字符串
发布时间 - 2026-01-02 00:00:00 点击率:次本文详解一个适用于php的正则表达式,用于匹配以字母或数字为核心、支持首尾可选下划线(_)或连字符(-)、且禁止连续两个相同分隔符(如 `__` 或 `--`)的字符串,兼容示例如 `_test147`、`test-test_` 等。
在 PHP 中实现严格但灵活的标识符
校验(如用户名、变量名、URL 片段等)时,常需满足以下业务约束:
- 字符串至少包含一个字母或数字(即不能全为符号);
- 允许开头和结尾各有一个可选的 _ 或 -;
- 中间可出现多个 _ 或 -,但必须被字母/数字隔开(即不允许 __、--、_-、-_ 等连续分隔符);
- 不区分大小写(推荐通过 i 修饰符实现,而非硬编码 [a-zA-Z])。
✅ 推荐正则表达式(兼顾可读性与兼容性):
/^[-_]?[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] 更简洁) |
✅ 测试用例验证(PHP 示例)
$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❌ 常见非法输入(均被拒绝)
- __test → 开头重复 _
- test--end → 中间重复 -
- _ 或 - → 无字母数字,不满足“至少一个字母数字”
- a_b__c → __ 连续下划线
- -a- → 结尾 - 后无字母数字(但本表达式允许 a-,因结尾 [-_]? 不要求后续内容;若需禁止孤立结尾分隔符,请见下方增强版)
⚙️ 性能优化版(PHP 7.3+ 推荐)
若处理海量数据且需极致性能,可启用占有量词(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
# 性能优化
# 下划线
# 分隔符
# 可选
# 修饰符
# 多个
# 适用于
# 仅为
# 各有
# 而非
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何快速查询网址的建站时间与历史轨迹?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Bootstrap整体框架之JavaScript插件架构
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
如何为不同团队 ID 动态生成多个“认领值班”按钮
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何注册花生壳免费域名并搭建个人网站?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
香港服务器WordPress建站指南:SEO优化与高效部署策略
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
如何快速搭建FTP站点实现文件共享?
Laravel如何生成URL和重定向?(路由助手函数)
Python文本处理实践_日志清洗解析【指导】
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
香港服务器部署网站为何提示未备案?
微信小程序 HTTPS报错整理常见问题及解决方案
如何在IIS中新建站点并配置端口与IP地址?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
如何快速搭建虚拟主机网站?新手必看指南
高端建站如何打造兼具美学与转化的品牌官网?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
简单实现Android文件上传
IOS倒计时设置UIButton标题title的抖动问题
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何快速配置高效服务器建站软件?
如何在阿里云高效完成企业建站全流程?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Python数据仓库与ETL构建实战_Airflow调度流程详解
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel安装步骤详细教程_Laravel环境搭建指南
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Java遍历集合的三种方式
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
手机软键盘弹出时影响布局的解决方法

