如果数组包含字符串,则排除数组

时间:2017-10-21 10:35:11

标签: php regex preg-split

想知道我是否可以再看一眼。

用例;从区域文件中获取DNS记录,以便运行shell_exec将其导入另一个平台。

我正试图从区域文件,A记录,CNAME,TXT,MX等中获取所有类型的DNS记录。到目前为止我做得很好,因为我已经设法做了CNAME,TXT和MX记录。

我被困在A记录上。不幸的是,当我在搜索文件的每一行时,这导致CNAME和SOA也被返回。这就是我所拥有的:

// Looking for:
$search_a = 'A';

// Read from file
$lines = file("$domain.");

// Check if the line contains A
foreach($lines as $a) {
    if(strpos($a, $search_a) !== false) {
    $a_array = "$a";
    $a_record_output = preg_split('/(.'.$domain.'.|\s)/', $a_array, -1, PREG_SPLIT_NO_EMPTY);
    print_r($a_record_output);
    }
}

返回:

Array
(
    [0] => domain.io.
    [1] => SOA
    [2] => ns1.domain.io.
    [3] => stuff.
    [4] => (64719
    [5] => 14400
    [6] => 7200
    [7] => 2419200
    [8] => 3600)
)
Array
(
    [0] => domain.io.
    [1] => A
    [2] => 8.8.8.8
)
Array
(
    [0] => autodiscover
    [1] => CNAME
    [2] => autodiscover.outlook.com.
)

显然它正在运行,但是,我需要排除SOA和CNAME记录,因为我只搜索A记录。

我需要完全忽略CNAME和SOA数组,只返回只包含A的数据。这里是区域文件的摘录

domain.io.      A   8.8.8.8
www             CNAME domain.io

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以检查结果数组的第二个元素是否为A,并且仅在它是的情况下,继续您的逻辑。否则,跳过这一行:

if ($a_record_output[1] !== "A") continue;

Demo

如果您根本没有选择记录而不是过滤记录,那可能会更好。您可以preg_match()使用单词边界而不是strpos()

if (preg_match("/\b".$search_a."\b/i", $a)) {

Demo

答案 1 :(得分:0)

如果您要将文本文件放入数组表单,则可以使用preg_grep()进行过滤。这是使用preg_match()在循环中搜索的合理替代。

$search_a = 'A';
var_export(preg_grep('/^[^\t]+\t+'.$search_a.'\t/',file("$domain.")));

这匹配从每行的前面,一个或多个非制表符,然后是一个或多个制表符,然后是针字符串,然后是制表符,以确保我们进行紧密匹配。

可能需要

preg_quote(),具体取决于$search中将使用的字符。

......有几种方法可以给这只猫上皮。

P.S。您的preg_split()模式也可以使用一些细化。如果您提供文件中的原始文本,我可以为您制作更好的文本。