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

preg_match_all匹配nmap端口扫描结果无法找到所有开放端口怎么办

问题原因

你遇到的问题核心是正则中固定匹配单个空格,而nmap为了输出列对齐,不同长度的端口号后跟随的空格数量不一致:
nmap的PORT列是固定宽度右对齐输出,2位长度的80端口对应的80/tcp后会填充2个空格,3位长度的443端口对应的443/tcp后仅填充1个空格。你原正则中tcp和open之间仅写了1个空格,只能适配443端口的场景,无法匹配80端口后的多空格场景,因此只有443端口的结果被匹配到。
补充说明:你贴出的正则写法中端口和协议之间的/没有转义,若实际运行时也没有转义会触发PHP正则语法报错,推测是内容排版时转义符被过滤了。

解决方法

把正则中固定的单空格替换为匹配1个及以上空白字符的\s+规则即可同时匹配两个端口:

preg_match_all('/[0-9]{1,5}\/[a-z]{3}\s+open/', $result, $out, PREG_PATTERN_ORDER);

如果你的需求仅需要判断80、443两个端口的开放状态,可以直接精准匹配,不需要全量扫描所有端口,效率更高:

$is80Open = preg_match('/80\/tcp\s+open/', $result);
$is443Open = preg_match('/443\/tcp\s+open/', $result);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:54:05