Laravel中从WHOIS响应提取域名服务器遇PCRE2问题求助
解决Laravel中提取WHOIS响应域名服务器的问题
错误原因分析
你遇到的PCRE2编译错误,是因为正则中使用了\u003C这种PCRE2不支持的转义序列,同时代码里的正则多了个多余的@符号,且preg_match只能匹配单个结果,无法获取所有域名服务器。
方案一:修正正则表达式(推荐)
使用preg_match_all匹配所有域名服务器,同时将\u003C替换为直接的<字符(或使用\x3C十六进制转义),修正后的代码如下:
// 假设$responseData3是包含WHOIS响应的字符串 preg_match_all('/nserver:\s*(.*?)<br/', $responseData3, $matches); if (!empty($matches[1])) { $nameservers = $matches[1]; dd($nameservers); // 输出所有域名服务器数组 } else { dd("No nameserver found."); }
如果WHOIS响应里的<br是带空格的<br /,可以调整正则为:
preg_match_all('/nserver:\s*(.*?)<br\s*\/?/', $responseData3, $matches);
方案二:字符串分割法(无需正则)
如果对正则不熟悉,可以用字符串函数分步处理:
// 先按换行分割WHOIS内容 $lines = explode("\n", $responseData3); $nameservers = []; foreach ($lines as $line) { // 筛选以nserver:开头的行 if (str_starts_with(trim($line), 'nserver:')) { // 分割出域名服务器部分,去除多余的<br标签 $parts = explode(':', $line); $ns = trim($parts[1]); $ns = str_replace(['<br /', '<br'], '', $ns); $nameservers[] = trim($ns); } } if (!empty($nameservers)) { dd($nameservers); } else { dd("No nameserver found."); }
额外注意事项
- 确保
$responseData3是解析后的WHOIS字符串,而不是原始的JSON(如果是JSON需要先json_decode取出whois字段)。 - 不同WHOIS服务器的响应格式可能不同,上述方法针对IRNIC的响应格式优化,若处理其他域名后缀可能需要调整匹配规则。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

