用 preg_match() 配合正则 /^\d+(\.\d+){1,3}(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$/ 可判断 PHP 变量是否符合常见版本号格式,需先 trim() 清理空白与 BOM。

怎么判断一个 PHP 变量是否符合常见版本号格式
PHP 本身没有内置函数直接校验「版本号格式」,但可以用 preg_match() 配合正则表达式快速识别。最稳妥的做法是匹配语义化版本(SemVer)的常见子集:如 1.2.3、2.10.0-beta.2、0.9.1-rc1 等,而非只接受纯数字点分格式。
注意:不要用 version_compare() 做格式校验——它只比较合法版本字符串,对 "abc" 或 "1.2." 这类非法输入会静默返回 false 或触发警告,不报错也不说明格式问题。
推荐正则:匹配主流版本号写法(含预发布和构建标识)
以下正则覆盖绝大多数实际场景(Composer、NPM、GitHub tag 常见格式):
/^\d+(\.\d+){1,3}(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$/
说明:
立即学习“PHP免费学习笔记(深入)”;
-
^\d+:主版本号,至少一位数字 -
(\.\d+){1,3}:允许 1~3 级次版本(即支持1.0、2.15.4、0.1.2.9,但不鼓励四段以上) -
(-[0-9A-Za-z.-]+)?:可选预发布字段,如-alpha、-1.2.3、-beta.2 -
(\+[0-9A-Za-z.-]+)?:可选构建元数据,如+20230101、+git.abcd123
使用示例:
$v = "1.23.0-rc.1+build.42";
if (preg_match('/^\d+(\.\d+){1,3}(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$/', $v)) {
echo "格式有效";
}
什么时候该放宽或收紧校验规则
根据使用场景调整正则边界:
- 校验 Composer
composer.json中的version字段 → 用上面完整正则,它兼容 Packagist 接受的所有格式 - 解析 Linux 内核版本(如
5.15.0-107-generic)→ 把开头改成^\d+\.\d+\.\d+,后续允许任意非空格字符 - 只接受严格 SemVer 2.0(不含构建号)→ 去掉末尾的
(\+[0-9A-Za-z.-]+)?部分 - 对接旧系统只认
X.Y.Z三段纯数字 → 改为/^\d+\.\d+\.\d+$/,更高效且避免误匹配
容易忽略的坑:字符串前后空白与编码问题
用户输入或配置文件读取的版本号常带空格或 BOM,导致正则失败:
- 务必先用
trim()清理:$v = trim($v); - 若从 JSON 或 UTF-8 文件读取,检查是否含不可见字符(如
\uFEFF),可用mb_trim()或preg_replace('/^\s+|\s+$/u', '', $v) - 避免用
is_numeric()或filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT)—— 它们会把"1.2.3"变成"1.23",彻底破坏结构
版本号不是数字,是结构化字符串;校验的核心是「模式匹配」,不是「数值转换」。











