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
相关产品推荐
相关产品推荐

