求助:使用jQuery preg_match验证SRV记录的正则表达式问题
修复SRV记录验证的正则表达式问题
我来帮你搞定这个SRV记录的正则验证问题!你之前的正则主要问题是对目标地址(域名/IP)的匹配范围太窄,而且正则结构有一些逻辑错误,导致无法识别带点的域名或者IP地址。
正确的正则表达式
首先直接给你能用的正则,完全覆盖你需要的格式:
/^(\d+)\s+(\d+)\s+(\d+)\s+([a-zA-Z0-9.-]+(?:\.[a-zA-Z0-9.-]+)*)(?:\s+)?$/
正则各部分解释
我拆开来给你讲每个部分的作用,方便你理解和调整:
^和$:确保我们匹配的是整个字符串,避免部分匹配的情况(\d+):匹配优先级(PriorNumber),一个或多个数字,这是第一个捕获组\s+:匹配一个或多个空格作为字段分隔符(支持多个空格的情况)(\d+):匹配权重(WeightNumber),同样是一个或多个数字,第二个捕获组(\d+):匹配端口(PortNumber),数字格式,第三个捕获组([a-zA-Z0-9.-]+(?:\.[a-zA-Z0-9.-]+)*):这是核心的目标地址匹配部分:[a-zA-Z0-9.-]:允许字母、数字、点(域名的层级分隔)和连字符(域名中允许的字符)(?:\.[a-zA-Z0-9.-]+)*:允许零或多个带点的后缀,支持多级域名(比如sip.example.com),也能匹配IPv4地址(比如192.168.0.1)
(?:\s+)?:可选的末尾空格,不捕获,满足你说的“整体最多5个部分”的灵活需求
测试用例
这个正则能正确匹配以下示例:
100 1 4234 sipdsdfghj100 1 4234 sipdsdfghj.sadas50 10 5060 192.168.1.10 0 80 example-co.com
同时会拒绝不符合格式的内容,比如:
- 缺少目标地址的
100 1 4234 - 优先级/权重/端口不是数字的
abc 1 4234 test - 包含非法字符的
100 1 4234 test@bad-domain
jQuery中使用示例
把这个正则放到你的jQuery代码里验证输入:
// 定义正则 const srvRecordRegex = /^(\d+)\s+(\d+)\s+(\d+)\s+([a-zA-Z0-9.-]+(?:\.[a-zA-Z0-9.-]+)*)(?:\s+)?$/; // 获取输入值 const inputVal = $('#your-input-element').val().trim(); // 先trim避免前后空格干扰 // 验证 if (srvRecordRegex.test(inputVal)) { alert('SRV记录格式正确!'); // 这里可以获取捕获的字段值,比如优先级:srvRecordRegex.exec(inputVal)[1] } else { alert('请输入正确格式的SRV记录:优先级 权重 端口 目标地址'); }
扩展:支持IPv6地址
如果你的场景需要支持IPv6格式的目标地址(比如[2001:db8::1]),可以把正则修改为:
/^(\d+)\s+(\d+)\s+(\d+)\s+([a-zA-Z0-9.-]+(?:\.[a-zA-Z0-9.-]+)*|\[[0-9a-fA-F:]+\])(?:\s+)?$/
新增的\[[0-9a-fA-F:]+\]部分用来匹配带方括号的IPv6地址。
内容的提问来源于stack exchange,提问作者Mitch Daniels
相关产品推荐
相关产品推荐

