用 preg_match() 配合正则 /^\d+(\.\d+){1,3}(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$/ 可判断 PHP 变量是否符合常见版本号格式,需先 trim() 清理空白与 BOM。
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.-]+)?$/
说明:
^\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.-]+)?:可选构建元数据,如 +20250101、+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.json 中的 version 字段 → 用上面完整正则,它兼容 Packagist 接受的所有格式5.15.0-107-generic)→ 把开头改成 ^\d+\.\d+\.\d+,后续允许任意非空格字符(\+[0-9A-Za-z.-]+)? 部分X.Y.Z 
/^\d+\.\d+\.\d+$/,更高效且避免误匹配用户输入或配置文件读取的版本号常带空格或 BOM,导致正则失败:
trim() 清理:$v = trim($v);
\uFEFF),可用 mb_trim() 或 preg_replace('/^\s+|\s+$/u', '', $v)
is_numeric() 或 filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT) —— 它们会把 "1.2.3" 变成 "1.23",彻底破坏结构版本号不是数字,是结构化字符串;校验的核心是「模式匹配」,不是「数值转换」。