配置文件解析器处理服务器范围格式的技术求助
解决方案
1. 优化正则匹配规则
你当前的正则表达式无法精准提取范围的起始/结束数字以及前后缀,需要调整规则来捕获四个核心部分:
- 服务器前缀(如
s) - 范围起始数字(如
01) - 范围结束数字(如
19) - 域名后缀(如
.domen.local)
推荐使用以下正则:
$pattern = '/^([a-z]+)\[(\d+):(\d+)\](\..+)$/i';
2. 解析范围并展开条目
匹配成功后,需要完成三个关键操作:
- 将起始/结束数字转为整数,实现范围遍历
- 保留原数字的补零格式(比如输出
01而非1) - 循环生成每个独立的服务器条目
完整代码示例
替换你现有的判断逻辑,使用以下代码:
$s_tmp = trim($s_tmp); // 匹配范围格式的服务器条目 $pattern = '/^([a-z]+)\[(\d+):(\d+)\](\..+)$/i'; if (preg_match($pattern, $s_tmp, $matches)) { $prefix = $matches[1]; // 提取前缀,例如"s" $start = intval($matches[2]);// 转换起始数字为整数,例如1 $end = intval($matches[3]); // 转换结束数字为整数,例如19 $suffix = $matches[4]; // 提取域名后缀,例如".domen.local" $digitLength = strlen($matches[2]); // 获取原数字的位数,例如2位 // 遍历范围生成每个服务器条目 for ($i = $start; $i <= $end; $i++) { // 格式化数字,补零到原位数 $formattedNum = str_pad($i, $digitLength, '0', STR_PAD_LEFT); $server = $prefix . $formattedNum . $suffix; echo $server . "<br />"; } } else { // 普通条目直接输出 echo $s_tmp . "<br />"; }
关键细节说明
- 正则匹配:
/i修饰符确保前缀不区分大小写;^和$限定匹配整行,避免部分匹配的情况。 - 数字补零:用
str_pad保持原有的数字位数,确保生成的服务器名和原格式一致,不会出现s1.domen.local这种不符合要求的条目。 - 范围遍历:将起始/结束数字转为整数后,通过
for循环逐个生成条目,覆盖范围内的所有数值。
测试效果
对于输入s[01:19].domen.local,会输出:
s01.domen.local s02.domen.local ... s19.domen.local
对于s[34:59].domen.local,会输出s34到s59的所有服务器条目。
内容的提问来源于stack exchange,提问作者Alatau
相关产品推荐
相关产品推荐

