You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP正则匹配域名DNS服务器失败问题求助

解决PHP中解析.com和.co.uk WhoIs结果中DNS服务器的正则问题

看起来你遇到的核心问题是原正则表达式的匹配逻辑不够灵活,无法适配.co.uk WhoIs结果里的DNS服务器格式。让我们一步步拆解问题并解决它:

原正则的问题分析

你的原正则:/Name [Ss]ervers?:\s([\S]+\s){0,3}/存在几个关键局限:

  • 硬限制了最多匹配3个DNS服务器({0,3}),如果.co.uk的结果里服务器数量超过3个就会漏掉
  • 要求每个服务器后面必须带空格([\S]+\s),但最后一个服务器后面通常没有空格,导致无法匹配完整
  • 没有考虑DNS服务器可能跨多行的情况(部分.co.uk WhoIs结果会把DNS服务器分行列出)

改进后的正则表达式

我们可以调整正则来解决这些问题,同时兼容.com和.co.uk的格式:

$regex = '/Name [Ss]ervers?:\s*(.*?)(?=\n\S|\z)/s';

正则规则解释

  • Name [Ss]ervers?::匹配"Name Server:"、"Name Servers:"、"name servers:"等大小写组合,覆盖两种域名的格式差异
  • \s*:匹配0个或多个空白字符(包括空格、制表符),适配不同WhoIs结果的缩进格式
  • (.*?):非贪婪匹配所有字符,直到遇到停止条件,避免过度匹配其他WhoIs字段
  • (?=\n\S|\z):正向预查,停止条件是「换行后跟着非空白字符」(表示下一个是新的WhoIs字段)或者「字符串结束」
  • /s修饰符:让.匹配换行符,处理DNS服务器跨多行列出的情况

PHP代码示例

结合你的使用场景,完整的解析代码可以这样写:

// 示例.co.uk WhoIs响应(模拟真实返回格式)
$whoisResponse = <<<WHOIS
Domain name: example.co.uk

Registrar: Demo Registrar Ltd [Tag = DEMOREG]
URL: https://www.demoregistrar.com

Registered on: 01-Jan-2020
Expiry date: 01-Jan-2025

Name servers:
    dns1.registrar-servers.com
    dns2.registrar-servers.com
    dns3.registrar-servers.com

WHOIS;

// 匹配DNS服务器区域
$regex = '/Name [Ss]ervers?:\s*(.*?)(?=\n\S|\z)/s';
preg_match($regex, $whoisResponse, $matches);

if (!empty($matches[1])) {
    // 提取所有DNS服务器,去除空白和换行符
    $dnsServers = preg_split('/\s+/', trim($matches[1]));
    print_r($dnsServers);
} else {
    echo "未找到DNS服务器信息";
}

这段代码会输出:

Array
(
    [0] => dns1.registrar-servers.com
    [1] => dns2.registrar-servers.com
    [2] => dns3.registrar-servers.com
)

额外优化建议

  • 如果你需要兼容更多域名后缀的WhoIs格式,建议使用专门的WhoIs解析库(比如phpwhois),比正则表达式更稳定可靠
  • 部分WhoIs服务器会返回多个"Name servers"字段,你可以用preg_match_all来捕获所有可能的结果

内容的提问来源于stack exchange,提问作者Liam G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:08